如何删除二维数组中的重复行?爪哇

时间:2019-11-23 22:08:36

标签: java arrays arraylist

我有一个二维数组,如果存在重复的日期和物质,我想查找这些值的平均值。新的二维数组应该没有重复的日期和物质。

    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)取平均值。创建的新数组列表应少一行。我将如何去做?

2 个答案:

答案 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
相关问题