java - 如何从对象列表中删除重复项

标签 java duplicates

我有一个包含以下数据(虚拟)的 excel 文件

a   b   c
d   b   c
e   b   c
f   b   c
g   b   c
e   b   c
d   b   c
d   b   c
d   b   c

我正在读取此文件并将结果存储在一个集合中,以便可以删除重复项并且我只获得唯一列表。 以下是我尝试过的

FileInputStream file = new FileInputStream(new File("C:\\Users\\harshita.sethi\\Desktop\\ALLOT010T_Input_Keywords.xls"));
HSSFWorkbook w = new HSSFWorkbook(file);
HSSFSheet sheet = w.getSheetAt(0);
int totalrows = sheet.getLastRowNum();

System.out.println(sheet.getRow(0).getPhysicalNumberOfCells());
String[][] data = new String[totalrows+1][sheet.getRow(0).getPhysicalNumberOfCells()];
Set<String[]> keySet = new HashSet<>();
for (int i = 0; i <= totalrows; i++) {
    for (int j = 0; j < sheet.getRow(0).getPhysicalNumberOfCells(); j++) {
        HSSFCell cell = sheet.getRow(i).getCell(j);
        // writing keywords from excel into a hashmap

        data[i][j]=cell.getRichStringCellValue().getString();
    }
    keySet.add(data[i]);

}
Iterator<String[]> iterator = keySet.iterator();
System.out.println("Output Set is as below");
while(iterator.hasNext()){
    String[] next = iterator.next();
    System.out.println(next[0] + "\t"+ next[1] +"\t "+next[2]);
}

这段代码的输出如下图所示

Output Set is as below
d   b    c
e   b    c
a   b    c
d   b    c
d   b    c
g   b    c
e   b    c
f   b    c
d   b    c

集合没有删除重复项。我还可以使用什么其他方法来消除这些重复项。 任何列都可以具有不同或相同的值。所以我无法删除基于特定列的重复项。

我希望整行都是唯一的。

PS:这个数据只是假的。在实际场景中,我有更多的列,任何列的值都可以不同,这将使行唯一。

最佳答案

Set<String[]>不能使用 HashSet实现,因为数组不会覆盖默认的 hashCode()equals()实现Object类。

您的替代方案是使用 Set<List<String>> (即将每个 String[] 转换为 List<String> ,这可以通过 Arrays.asList() 轻松完成)或 TreeSet<String[]>自定义 Comparator<String[]> .

例如:

Set<List<String>> keySet = new HashSet<>();
for (int i = 0; i <= totalrows; i++) {
    for (int j = 0; j < sheet.getRow(0).getPhysicalNumberOfCells(); j++) {
        HSSFCell cell = sheet.getRow(i).getCell(j);
        // writing keywords from excel into a hashmap

        data[i][j]=cell.getRichStringCellValue().getString();
    }
    keySet.add(Arrays.asList(data[i]));
}
Iterator<List<String>> iterator = keySet.iterator();
System.out.println("Output Set is as below");
while(iterator.hasNext()){
    List<String> next = iterator.next();
    System.out.println(next.get(0) + "\t"+ next.get(1) +"\t "+next.get(2));
}

关于java - 如何从对象列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33251964/

相关文章:

java - Hashmap 中相同键的数据更新

php - 在mysql中插入单行导致行重复

Java表索引存储在堆中?

Java 可调整大小的位数组?

algorithm - 为什么以下两个重复查找算法的时间复杂度不同?

python - 如何删除 .txt 文件中的重复项

sql - 如何忽略 SQL 中重复的主键?

java - Hibernate 搜索,过滤器位于其他过滤器之上

java - 将纬度/经度转换为 JTS?

java - Google App Engine JDO 错误