我有一个二维数组,如果存在重复的日期和物质,我想查找这些值的平均值。新的二维数组应该没有重复的日期和物质。
String [] [] array = {
{"804", "2007-01-02", "1", "Alkalinity", "38.6"},
{"804", "2007-01-02", "1", "Alkalinity", "39.6"},
{"804", "2007-01-02", "1", "PH", "36.6"},
{"804", "2007-01-02", "1", "Conductivity", "40.8"},
{"804", "2008-10-02", "10", "Alkalinity", "39.5"},
{"817", "04-10-99", "10", "Alkalinity", "38.4"},
{"826", "04-10-99", "10", "PH", "38.2"}
} ;
这是数组一部分的示例。由于前两行具有相同的日期并且都具有碱度,因此应将它们的值(38.6和39.6)取平均值。创建的新数组列表应少一行。我将如何去做?
答案 0 :(得分:0)
我有以下想法:
您必须检查每一行及其后的行。
如果以下任何行与您检查的行相等,请不要将其添加到列表中。
我写了这段代码:
ArrayList<String[]> arrayListUniqueRows = new ArrayList<>();
for(int i = 0; i < array.length - 1; i++){
boolean rowToAdd = true; //potential i row is to add to list
for(int j = i + 1; j < array.length; j++){
boolean sameRows = true; //two potential rows are equal
for(int k = 0; k < array[k].length; k++){
if(!array[i][k].equals(array[j][k])){ //check if they are
sameRows = false;
}
}
if(sameRows){ //if they are signalize to not add i row to unique list
System.out.println("Rows " + (i+1) + " and " + (j+1) + " are equal!");
rowToAdd = false;
}
}
if(rowToAdd){
arrayListUniqueRows.add(array[i]);
}
}
System.out.println(arrayListUniqueRows.size());
它为您提供了一个唯一行的数组列表。用它做任何您想做的事。
答案 1 :(得分:0)
一个简单的解决方案是根据日期和碱度值对行进行排序。然后,导航阵列并根据您的要求合并具有相同日期和碱度的行。下面给出的是相同的代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Main {
public static void main(String[] args) {
String [] [] array = {
{"804", "2007-01-02", "1", "Alkalinity", "38.6"},
{"804", "2007-01-02", "1", "Alkalinity", "39.6"},
{"804", "2007-01-02", "1", "PH", "36.6"},
{"804", "2007-01-02", "1", "Conductivity", "40.8"},
{"804", "2008-10-02", "10", "Alkalinity", "39.5"},
{"817", "04-10-99", "10", "Alkalinity", "38.4"},
{"826", "04-10-99", "10", "PH", "38.2"}
} ;
List<String[]> list = new ArrayList<String[]>();
for (int i = 0; i < array.length; i++)
list.add(array[i]);
Collections.sort(list, arrComparator);
System.out.println("Sorted list:");
for (String[] s : list)
System.out.println(Arrays.toString(s));
List<String[]> newList = new ArrayList<String[]>();
String[] strArr = list.get(0);
for (int i = 1; i < list.size(); i++) {
double sum = 0.0;
int count = 1;
while (strArr[1].equals(list.get(i)[1]) && strArr[3].equals(list.get(i)[3])) {
sum += Double.parseDouble(strArr[4]) + Double.parseDouble(list.get(i)[4]);
strArr = list.get(i);
i++;
count++;
}
if (count > 1) {
newList.add(new String[] { strArr[0], strArr[1], strArr[2], strArr[3], String.valueOf(sum / count) });
} else {
newList.add(strArr);
}
strArr = list.get(i);
}
newList.add(list.get(list.size() - 1));
System.out.println("Final list:");
for (String[] s : newList)
System.out.println(Arrays.toString(s));
}
public static Comparator<String[]> arrComparator = new Comparator<String[]>() {
@Override
public int compare(String[] strArr1, String[] strArr2) {
String date1 = strArr1[1];
String date2 = strArr2[1];
int sComp = date1.compareTo(date2);
if (sComp != 0) {
return sComp;
}
return strArr1[3].compareTo(strArr2[3]);
}
};
}
输出:
Sorted list:
[817, 04-10-99, 10, Alkalinity, 38.4]
[826, 04-10-99, 10, PH, 38.2]
[804, 2007-01-02, 1, Alkalinity, 38.6]
[804, 2007-01-02, 1, Alkalinity, 39.6]
[804, 2007-01-02, 1, Conductivity, 40.8]
[804, 2007-01-02, 1, PH, 36.6]
[804, 2008-10-02, 10, Alkalinity, 39.5]
Final list:
[817, 04-10-99, 10, Alkalinity, 38.4]
[826, 04-10-99, 10, PH, 38.2]
[804, 2007-01-02, 1, Alkalinity, 39.1]
[804, 2007-01-02, 1, Conductivity, 40.8]
[804, 2007-01-02, 1, PH, 36.6]
[804, 2008-10-02, 10, Alkalinity, 39.5