仅在第一列

时间:2015-09-01 06:21:47

标签: java arrays

我有一个看起来像这样的2D数组。

  

10002,20
  10004,72
  10008,12
  10010,37
  10010,34
  10007,28
  20003,42
  20003,38
  10002,16

正如您所看到的,它在第一列中有一些重复的数字,例如10010和20003,我只想打印弹出的每一个中的第一个。这意味着我希望println打印出来

  

10002,20
  10004,72
  10008,12
  10010,37
  10007,28
  20003,42
  端

(关键注意:第一列中弹出重复数字的第一个元素将始终在第二列中具有最大的int,EX:10010,37> 34和20003,42> 38总是。) 但我不确定该怎么做......

编辑:以下是包含XLS文件片段的完整代码

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class Read {

            public static void readXLSFile() throws IOException{
        InputStream ExcelFile = new FileInputStream("C:/Sales Data.xls");
        HSSFWorkbook wb = new HSSFWorkbook(ExcelFile);
                HSSFSheet sheet=wb.getSheetAt(0);

                int numRows = sheet.getPhysicalNumberOfRows(); 
                int[][] idSale = new int[numRows][2];

                for(int i=1;i<numRows;i++){
                    HSSFCell proId = sheet.getRow(i).getCell(1);
                    HSSFCell sales = sheet.getRow(i).getCell(2);
                    idSale[i][0]=(int)proId.getNumericCellValue();
                    idSale[i][1]=(int)sales.getNumericCellValue();
                }
                for(int j=1;j<numRows;j++){
                    for(int jj=j+1;jj<numRows;jj++)
                        if(idSale[j][0]==idSale[jj][0]){
                           idSale[j][1]+=idSale[jj][1];
//the problem with this loop is that there are repeated numbers in 
//the first column as I'm comparing the entire array to a copy of itself
//and I'm not sure how to avoid it...
                        }
                }
            }



            public static void main(String[] args) throws IOException {
        readXLSFile();
            }
}

这是我读过的XLS文件的片段。 http://postimg.org/image/drbq7fucz/ 该程序具有灵活性,可用于格式相同的excel文件。基本上,分配是添加匹配产品ID的单位,然后以行/列格式将它们吐出。客户ID无关紧要。我无法预设数组大小,因为程序必须能够读取可能包含不同行数的不同excel文件...

4 个答案:

答案 0 :(得分:0)

存储您已打印的一组/一组值。

//provided int[][] rows;
Set<Integer> printed = new HashSet<>();
for(int[] row: rows){
    int before = printed.size();
    printed.add(row[0]);
    if(printed.size()>before){
        System.out.println(Arrays.toString(row));
    }
}

这会遍历数组中的所有行。 “已打印”包含已打印行的所有第一个值。在添加新元素之前,将before设置为打印的大小。

当调用printed.add(row[0]);时,会发生以下两种情况之一:该值已经在打印中,因此打印的尺寸不会发生变化。该值未打印,因此添加了元素。

只有在之前没有打印过元素时,检查printed.size()>before才会成立。

答案 1 :(得分:0)

这是一种方法。 Set不能包含重复元素。

Set<Integer> printed = new HashSet<>();

for (int[] item : list) {
   if(!printed.contains(item[0]) {
      printed.add(item[0]);
      // Print your line
   }
}

答案 2 :(得分:0)

以下示例程序将完成工作:

public static void main(String[] args) {
        int[][] sample = {{10002, 20},
                {10004, 72},
                {10008,12},
                {10010,37},
                {10010,34},
                {10007,28},
                {20003,42},
                {20003,38}
        };

        Set<Integer> unique = new HashSet<>();
        boolean newAddition = false;
        for(int[] row : sample) {
             newAddition = unique.add(row[0]);
             if(newAddition) {
                 System.out.println(Arrays.toString(row));
             }
        }
    }

输出结果为:

[10002, 20] [10004, 72] [10008, 12] [10010, 37] [10007, 28] [20003, 42]

说明:它使用了不允许重复的Set。当我们向集合中添加一个元素时,它将返回boolean,如果最近添加的元素是唯一的,则返回true。在这种情况下,我们将从数组中打印该特定行。

答案 3 :(得分:0)

假设值的分组如示例中所示,这是最简单的方法:

int[][] array = { {10002,20},
                  {10004,72},
                  {10008,12},
                  {10010,37},
                  {10010,34},
                  {10007,28},
                  {20003,42},
                  {20003,38} };
int prev = array[0][0] - 1; // make sure it's different from first value
for (int[] pair : array) {
    if (pair[0] != prev) {
        System.out.printf("%d,%d%n", pair[0], pair[1]);
        prev = pair[0];
    }
}

输出

10002,20
10004,72
10008,12
10010,37
10007,28
20003,42