Объединить данные двух файлов в зависимости от ключевого атрибута в Java - PullRequest
0 голосов
/ 26 июня 2018

У меня есть два файла данных data1.txt и data2.txt. data1.txt состоит из 3 столбцов и 10 строк, а data2.txt состоит из 4 столбцов и 4 строк.

Структура data1.txt:

1.0  1.235   2.3145
2.0  0.325   3.2145
3.0  1.568   4.0215
4.0  0.389   1.2354
7.0  2.054   1.3247
8.0  1.111   2.6570
10.0  1.786   1.2587
11.0  5.628   0.2354
13.0  4.897   1.6542
15.0  1.230   1.0210 

Структура data2.txt:

5.0  .... .... ....
6.0  .... .... .... 
9.0  .... .... ....
12.0 .... .... ....

Таким образом, в соответствии с набором данных 5.0,6.0 отсутствует в data1.txt, который находится в data2.txt. 9.0 отсутствует в data1.txt, который присутствует в data2.txt и так далее. Я хочу вставить эти отсутствующие значения в data1.txt. Таким образом, выходной файл данных после вставки будет

Data1.txt

 1.0  1.235   2.3145
 2.0  0.325   3.2145
 3.0  1.568   4.0215
 4.0  0.389   1.2354 
 5.0  .... .... ....
 6.0  .... .... .... 
 7.0  2.054   1.3247
 8.0  1.111   2.6570 
 9.0  .... .... ....
 10.0  1.786   1.2587
 11.0  5.628   0.2354 
 and so on

Мой код такой

public class F1 {
public static void main(String args[])throws Exception{
    Scanner X =new Scanner(new File("C:\\data1.txt"));
    Scanner Y =new Scanner(new File("C:\\data2.txt"));
    double a=0.0,b=0.0,c,d=0.0,e=0.0,f,g,h;
    List<Double>list1=new ArrayList<>();
    List<Double>list4=new ArrayList<>();
    double arr[]=new double[10];
    double arr1[]=new double[5];
        while (X.hasNext()) {
            a = X.nextDouble();
            list1.add(a);
            b = X.nextDouble();
            c = X.nextDouble();

        }

        while(Y.hasNext()) {
            d = Y.nextDouble();
            list4.add(d);
            e = Y.nextDouble();

            f = Y.nextDouble();

            g = Y.nextDouble();


        }

    for(int i=0;i<list1.size();i++) {

        arr[i]=list1.get(i);//Store value into an array
        }
        for(int j=0;j<list4.size();j++){
            arr1[j]=list4.get(j);//Store value into an array
        }
        for(int k=0;k<arr.length;k++){
       // Appending condition
        }
}

}

Как я мог продолжить? Нужна ли какая-либо вставка или оператор if для добавления? Как работал Printwriter здесь?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Надеюсь, вы не путаете свои массивы и списки. Вы определили свои массивы так:

double arr[]=new double[10];
double arr1[]=new double[5];
 for(int j=0;j<list4.size();j++){
     arr1[j]=list4.get(j);//Store value into an array
 }

и, очевидно, вы вставляете элементы list4, содержащие 10 элементов в arr1, который определен как содержащий только 5 элементов - это определенно выкинет IndexOutOfBoundsException.

0 голосов
/ 28 июня 2018

Для слияния, вы можете взять карту с ключом в качестве первой цифры и снова все значение в качестве значения. например 1,0 1,235 2,3145 1.0 как ключ и все это как ценность. Теперь вы можете сортировать карту по ключу. Это позволит поставить запись на отсортированный путь, и вы можете сделать дальнейший расчет. Это то, что вы хотели?

0 голосов
/ 26 июня 2018

Ваша проблема мне не ясна. Вы хотите решение индекса массива вне границ? ИЛИ вы хотите объединить решение.

Для индекса вне пределов - вы можете проверить логику сравнения элементов массива как:

for (int k = 0; k < arr.length; k++) {
    if (k == list4.size() - 1 && arr[k] < arr1[k]) {
        // error because array dimension mismatch

        double a1 = 3 + 5; // Any operation
    }
}
...