Java:从 txt 文件中读取并在数组 + 排序中仅存储每个单词一次



我的程序有问题。我应该做的是:

  1. 从某些 TXT 文件中查找所有单词
  2. 每个单词仅在数组中存储一次
  3. 然后按字母顺序排序

我不知道如何确保每个单词不会在我的数组中出现两次(或更多)。例如,我的一个文件中的一句话:我的猫很大,我的狗很懒。我希望单词"my"和"is"在我的数组中只出现一次,而不是两次。

至于排序,我可以从 Java 中使用什么吗?我不知道。

任何帮助不胜感激!

这是我到目前为止所做的:

try {
    File dir = new File("path of folder that contains my files")
    for (File f : dir.listFiles()) {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
        String line = null;
        while((line = br.readLine())!= null) {
            String [] tokens = line.split(",\s+|\s*\"\s*|\s+|\.\s*|\s*\:\s*");
        }
    }
}

以下是对唯一单词进行排序的修改代码:

try {
        TreeSet<String> uniqueSortedWords = new TreeSet<String>();
        File dir = new File(
                "words.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(dir)));
        String line = null;
        while ((line = br.readLine()) != null) {
            String[] tokens = line
                    .split(",\s+|\s*\"\s*|\s+|\.\s*|\s*\:\s*");
            for(String token: tokens) {
                uniqueSortedWords.add(token);
            }
        }
        System.out.println(uniqueSortedWords);
        //call uniqueSortedWords.toArray() to have output in an array
    } catch (Exception e) {
        e.printStackTrace();
    }

如果我猜你正在寻找这样的代码。

try {
    ArrayList<String> list = new ArrayList<String>();
    File dir = new File("path of folder that contains my files")
    for (File f : dir.listFiles()) {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
        String line = null;
        while((line = br.readLine())!= null) {
            String [] tokens = line.split(",\s+|\s*\"\s*|\s+|\.\s*|\s*\:\s*");
            for(int i=0; i<tokens.length(); i++)
            {  //Adding non-duplicates to arraylist
               if (!list.contains(tokens[i])  
               {
                   list.add(tokens[i]);
               }
            }
        }
        Collections.Sort(list);
    }
}
catch(Exception ex){}

不要忘记:import java.util.*;代码开头使用 Collections.Sort();

编辑

尽管 contains 是一个内置方法,您可以直接与 ArrayList 一起使用,但这种方法实际上是这样工作的(以防万一,如果你好奇的话):

public static boolean ifContains(ArrayList<String> list, String name) {
    for (String item : list) {
        if (item.getName().equals(name)) {
            return true;
        }
    }
    return false;
}

然后调用它:

ifContains(list, tokens[i]))

您可以使用 HashSet 和 TreeSet 的组合

  1. Hashset:hashset 允许空对象。
  2. 树集:树集
  3. 不允许空对象,树集元素默认按升序排序。
  4. HashSet 和 TreeSet 都不保存重复的元素。

    try {
        Set<String> list = new HashSet<>();
        File f = new File("data.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
        String line = null;
        while ((line = br.readLine()) != null) {
            String[] tokens = line.split(",\s+|\s*\"\s*|\s+|\.\s*|\s*\:\s*");// other alternative:line.split("[,;-!]")
            for (String token : tokens) {
                list.add(token);
            }
        }
        // Add the list to treeSet;Elements in treeSet are sorted
        // Note: words must have the same case either lowercase or uppercase
        // for sorting to work correctly
        TreeSet<String> sortedSet = new TreeSet<>();
        sortedSet.addAll(list);
        Iterator<String> ite = sortedSet.iterator();
        while (ite.hasNext()) {
            System.out.println(ite.next());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    

最新更新