不要删除LinkedHashSet上的重复项

时间:2017-07-13 21:58:49

标签: java

我不明白为什么在添加到Set时没有删除重复项,我从文件中读取,有一些代码被分组到表格

有一个这样的文件:

1)Class A{
2)if(a>0){
3)a=a+1:
4)System.out.print(a);
5)}
6)if(a>0){
7)a=a+1:
8)System.out.print(a);
9)}
10)}

然后成为这个:

0)Class A{
1)if(a>0){
a=a+1:
System.out.print(a);
}
2)if(a>0){
a=a+1:
System.out.print(a);
}
}

之后我将它添加到LinkedHashSet并期望删除一个副本,即一个if块,但没有任何反应,为什么?请解释

这是我的代码:

class C {
    public static void main(String [] args) throws FileNotFoundException {
        String [] rows = new Scanner(new File("file.txt")).useDelimiter("\\Z").next().split("\n");
        for ( String s : rows ){
            //System.out.println(s);
       }

        List<String> s = new ArrayList<>(); 
        List<String> newLines = new ArrayList<>();
        StringBuilder newLine = new StringBuilder();
        for (String line : rows) {
            if (line.endsWith("{")) {
                if (newLine.length() > 0) {
                    newLines.add(newLine.toString());
                }
                newLine = new StringBuilder(line);
            } else {
                newLine.append("\n").append(line);
            }

        }
        newLines.add(newLine.toString());
        String[] newstr = new String[newLines.size()];

        newLines.toArray(newstr);
        for(String b : newstr){
             System.out.println(b);
         }

         int i;
        LinkedHashSet<String> text = new  LinkedHashSet<>();
       for(i=0; i<newstr.length; i++){
            text.add(newstr[i].trim()); 
            }   
          System.out.println("-----------------------------------------------------------------");
           String[] stringArr = new String[text.size()];
            text.toArray(stringArr); 
            int j=0;
            for (String a : stringArr){
            j=j+1;
            System.out.println(a);
        }
        System.out.println("Новый размер = " + j);  
    }

}

3 个答案:

答案 0 :(得分:0)

简短的回答是LinkedHashSet确实会在您使用它时删除重复项。如果看起来它没有这样做,那么问题在于没有任何重复。

查看您的代码,我怀疑您的问题是您所看到的所谓的重复项是实际的行加入了嵌入式换行符。它们不是重复的,在Set看到它们的级别。

我建议以下内容确认:

  • 使用调试器/断点/单步执行来观察正在发生的事情。
  • 像这样打印去掉的数组:

    for (String a : stringArr){
        System.out.println("'" + a + "'");
    }
    

    查看是否确实存在重复的行。观察引号字符出现的位置!

答案 1 :(得分:0)

你似乎在问为什么

if(a>0){
a=a+1:
System.out.print(a);
}

if(a>0){
a=a+1:
System.out.print(a);
}
}

没有重复数据删除。这很简单:它们不一样。请注意第二种情况中的额外}

Here's your code在套装中打印出来的东西周围有一些额外的标记,这样可以更容易看到它。

答案 2 :(得分:0)

我认为您的问题是您只考虑{并且没有考虑结束的问题。

无论如何这是正确的代码:

public static void main(String[] args) throws FileNotFoundException {
        try (Scanner scan = new Scanner(new File("file.txt"))) {
            String rows[] = scan.useDelimiter("\\Z").next().split("\n");
            for (String s : rows) {
                System.out.println(s);
            }
            String start="'";
            String end="'";

            System.out.println("------------------------------------------------------------------");

            List<StringBuilder> groups = new ArrayList<StringBuilder>();
            StringBuilder result = new StringBuilder();
            //Add starting groups

            for (String line : rows) {
                if (line.trim().endsWith("{")) {
                    //group start
                    result.append(start);
                    //It is already in the new group
                    result.append(line);
                } else if (line.trim().endsWith("}")){
                    //is still with the last group
                    result.append(line);
                    //group end
                    result.append(end);
                }else{
                    result.append(line);
                }
            }
                System.out.println(result);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }

输出正确,块正确识别

Class A{
if(a>0){
a=a+1:
System.out.print(a);
}
if(a>0){
a=a+1:
System.out.print(a);
}
}
------------------------------------------------------------------
'Class A{'if(a>0){a=a+1:System.out.print(a);}''if(a>0){a=a+1:System.out.print(a);}'}'