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

时间:2016-03-11 14:50:29

标签: java

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

  1. 查找某些txt文件中的所有单词
  2. 将每个单词存储在数组中仅
  3. 然后按字母顺序排序
  4. 我不知道如何确保每个单词在我的数组中不会出现两次(或更多)。 例如,我的一个文件中的一句话:我的猫很大,我的狗很懒。 我希望单词“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*");
            }
        }
    }
    

3 个答案:

答案 0 :(得分:1)

以下是修改过的唯一单词的代码:

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();
    }

答案 1 :(得分:0)

如果我猜你正在寻找类似的代码。

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是一个内置方法,你可以直接使用ArrayLists,这就是这样一个方法的实际工作方式(以防万一你好奇):

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]))

答案 2 :(得分:0)

您可以使用HashSet和TreeSet的组合

  1. Hashset :hashset允许空对象。
  2. TreeSet :treeset不允许使用null对象,默认情况下,treeset元素按升序排序。
  3. 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();
    }