从set数组中删除重复项而不设置

时间:2017-09-06 08:51:34

标签: java arrays

所以我的String数组看起来像这样:

arraySubs:

math
math
math
web
web
web
prog
prog
prog

现在我想删除重复项,如下所示:

arraySubs:

math
web
prog

我不介意在应该删除的地方是否有空,所以我尝试了这个:

for(int j = 0; j < arraySubs.length; j++) {
    if(j<arraySubs.length-1) {
        if(arraySubs[j+1]==arraySubs[j]) {//equalsIgnoreCase doesn't work.
            arraySubs[j]=null;
        }   
    }
    if(arraySubs[j]!=null) {
        System.out.println(arraySubs[j]);
    }
}

但它不起作用它仍然打印所有这些,任何想法? 我不想使用Set,HashSet等或任何其他工具,如迭代器。 equals()不起作用......

3 个答案:

答案 0 :(得分:4)

如果您不想使用set,可以使用stream

list.stream()
    .distinct()
    .collect(Collectors.toList());

但是,使用set将是最有效和最明确的。

答案 1 :(得分:1)

您可以将streamcollect一起使用。这样,您甚至可以维护每个元素的计数,例如:

String[] array = new String[]{"math", "math", "web"};
Map<String, Long> items = Arrays.stream(array)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(items);
System.out.println(items.keySet());

答案 2 :(得分:0)

执行arraySubs[j+1]==arraySubs[j]时,比较实例ID而不是值。您应该使用arraySubs[j+1].equals(arraySubs[j])

尝试调试代码,或运行类似:

for(int j = 0; j < arraySubs.length; j++) {
    if(j<arraySubs.length-1) {
        System.out.println("j:" + j);
        System.out.println("j val:" + arraySubs[j]);
        System.out.println("j+1 val:" + arraySubs[j+1]);
        if(arraySubs[j+1] != null && arraySubs[j+1].equalsIgnoreCase(arraySubs[j])) { // The FIX
            System.out.println("j val changed to null");
            arraySubs[j]=null;
        }   
    }
    if(arraySubs[j]!=null) {
        System.out.println(arraySubs[j]);
    } else {
        System.out.println("skipping null");
    }
}