我有一个看起来像这样的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文件...
答案 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