簡體   English   中英

如何刪除二維數組中的重復行? 爪哇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM