[英]How can I remove repeated rows in a two-dimensional array? Java
我有一個二維數組,如果有重復的材料日期+物質,我想找到這些值的平均值。 一個新的二維數組應該是沒有重復的日期+物質。
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)應該取平均值。 應創建一個少一行的新數組列表。 我該怎么做呢?
我有以下想法:
您必須檢查每一行及其后面的行。
如果以下任何行與您檢查的行相同,請不要將其添加到列表中。
我寫了這段代碼:
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());
它為您提供了一個唯一行的數組列表。 用它做任何你想做的事。
一個簡單的解決方案是根據日期和鹼度的值對行進行排序。 然后,導航數組並根據您的要求合並具有相同日期和鹼度的行。 下面給出的是相同的代碼:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.