2015-10-21 18 views
2

的列表中刪除重複我有一個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:這個數據就是傻乎乎的。在真實場景中,我有更多的列,並且任何列值都可能不同,這會使行具有唯一性。

+0

在你的情況你想要的'd b C'和'E B C'副本將被刪除? – Emz

+0

我想說'd b c'和'e b c'是唯一的行,因爲它們都有一個不同的值。但是'd b c'和'd b c'是相同的,因爲整行是相同的。 –

+0

爲什麼不能使用創建一個三列的對象,並使用比較器而不是數組? –

回答

3

Set<String[]>不能使用HashSet實現,因爲數組不覆蓋默認hashCode()equals()實施Object類的。

你的替代方案是使用Set<List<String>>(即相互轉換String[]List<String>,可方便地與Arrays.asList()完成)或自定義Comparator<String[]>一個TreeSet<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)); 
} 
+0

它按預期工作。非常感謝。 –

2

你可以用比較級:

您可以使用一個TreeSet與字符串數組是否相等的自定義比較。

Set<String[]> mySet = new TreeSet<>(new Comparator<String[]>() { 

    @Override 
    public int compare(String[] o1, String[] o2) { 
    //logic for comparison. 
    } 

}); 

另一個更好的方法是使用集合。使用列表,而不是一個String []的:

例如:

Set<List<String>> set = //... 
set.add(Arrays.asList("a", "b", "c")); 
set.add(Arrays.asList("a", "b", "c")); 
set.add(Arrays.asList("a", "b", "d")); 

System.out.println(set.size()); // 2 
+0

但他希望基於值的比較而不是散列碼 – dsharew