Java:查找列表中的每个唯一单词并将其添加到新列表中

sam*_*tob 3 java for-loop list

我正在尝试创建一个方法来查找列表中的每个唯一单词,然后将它们添加到新列表中.我尝试过以下方法:

   public static void countWords(){
   List<String> list1 = new ArrayList<String>();
   List<String> list2 = new ArrayList<String>();

   String inText = JOptionPane.showInputDialog(null, "Type in text");
   int start = 0;    

     for(int i = 0; i < inText.length(); i++) {
        if(inText.charAt(i) == ' ') {
           list1.add(inText.substring(start,i));
           start = i;
        }                           
     }
        for(int a = 0; a < list1.size(); a++) {
           for(int j = 0; j < a; j++) {
              if(list1.get(a) != list2.get(j)) {
                 list2.add(list2.get(a));                 
              }               
           }           
        }         
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序并输入"hi hi hi"时,我收到此错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at RäknaOrd.countWords(RäknaOrd.java:24)
at RäknaOrd.main(RäknaOrd.java:6)
Run Code Online (Sandbox Code Playgroud)

我怎么能修复这个错误?我的方法是否有效?

Man*_*dis 5

Java 8有一个很好的基于流的方法来返回一个删除了重复项的新列表:

List<String> list2 = list1.stream().distinct().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

另外要分割String并得到一个List<String>你可以避免像这样的for循环:

List<String> list1 = Arrays.asList(inText.split(" "));
Run Code Online (Sandbox Code Playgroud)

但请记住,list1在这种情况下,这是不可变的.

演示的最小例子是:

String inText = "hi hi hi";
List<String> list1 = Arrays.asList(inText.split(" "));
List<String> list2 = list1.stream().distinct().collect(Collectors.toList());
System.out.println(list2);
Run Code Online (Sandbox Code Playgroud)

哪个打印 [hi]

  • `import java.util.stream.Collectors;` (2认同)