【问题标题】:Add an element into a treeSet : infromation retrieval将元素添加到树集中:信息检索
【发布时间】:2016-10-26 17:18:15
【问题描述】:

我想创建一个反向索引,意味着

如果我在多文档中有一个术语,结果将是这样的

term 1 =[doc1], term2 =[doc2, doc3, doc4] ....

这是我的代码:

public class TP3 {    
    private static String DIRNAME = "/home/amal/Téléchargements/lemonde";    
    private static String STOPWORDS_FILENAME = "/home/amal/Téléchargements/lemonde/frenchST.txt";    

     public static TreeMap<String, TreeSet<String>> getInvertedFile(File dir, Normalizer normalizer) throws IOException {

        TreeMap<String, TreeSet<String>> st = new TreeMap<String, TreeSet<String>>();

        ArrayList<String> wordsInFile;
        ArrayList<String> words;
        String wordLC;

        if (dir.isDirectory()) {
            String[] fileNames = dir.list();    
            Integer number;         
            for (String fileName : fileNames) {   
                System.err.println("Analyse du fichier " + fileName);

                wordsInFile = new ArrayList<String>();
                words = normalizer.normalize(new File(dir, fileName));

                    for (String word : words) {
                        wordLC = word.toLowerCase();

                        if (!wordsInFile.contains(word)) {
                            TreeSet<String> set = st.get(word);
                            set.add(fileName);
                        }
                    }
                }
            }

            for (Map.Entry<String, TreeSet<String>> hit : st.entrySet()) {
                System.out.println(hit.getKey() + "\t" + hit.getValue());
            }
            return st;
        }
    }

我有一个错误

set.add(fileName);

我不知道是什么问题,请帮帮我

【问题讨论】:

  • 提示:这里的主要语言是英语。拥有使用其他“语言”的代码输入通常意味着您将收到很多积极/有用的输入。并且 - 如果完全一致的话。要么使用法语,要么只使用英语。但不要混用。
  • 实际上,由于编程语言通常是基于英语的,代码和变量名称都是英语,而所有字符串和 cmets 都是另一种语言,这似乎很合理。
  • 那么:您的代码输入的格式/缩进非常糟糕。我花了 3 分钟的时间阅读,直到我发现事实上,在那乱七八糟的地方有一个方法声明。你想让我们花时间来帮助我们,但是你把这样的烂摊子扔在这里?请编辑您的意见并改进这些内容!下一次:从 可读 输入开始!
  • TreeSet set = st.get(word);空指针异常,因为您从未为该键(或任何键)向 Map 添加值。
  • @BillK 我自己也遇到过很多次这种情况,我的想法是:关键字就是关键字,必须知道。但其他的都是命名;并因此与该源代码的作者/读者的语言相关联。重点是:要完全掌握上述代码,需要对法语和英语有一定程度的理解。因此,当您继续前进时(例如,您将代码开源;或者您在其他国家/地区的公司开发人员 - 将所有 cmets 翻译成英文很有趣)。

标签: java


【解决方案1】:

您的主要问题是这两行不会很好:

if (!wordsInFile.contains(word)) {
    TreeSet<String> set = st.get(word);

你从来没有把一个集合放入 st 所以集合将为空。在这一行之后,您可能应该有类似的内容:

if(set == null)
{
    set = new TreeSet<String>();
    st.put(word, set);
}

这应该可以解决您当前的问题。

提示下次,这将被未来有相同问题的用户重新阅读,也代表你(将来有人会在面试你的工作时阅读这个问题!)

花一些时间为您的读者考虑它的格式。修剪 cmets 并纠正缩进,不要只是粘贴和运行。还发布一点错误堆栈跟踪——它们非常有用!如果你发布了它,它会是一个“NullPointerException”,在那一行实际上只有一种方法可以获得 NPE,它可以让我们不必分析你的代码。

PS:我编辑了您的问题,以便您可以看到差异(并防止它对您关闭)。格式化的主要问题是标签的使用。对于程序员来说,标签是——好吧,我们只是说它们只能在非常受控的条件下工作。在这种情况下,在您编辑时查看预览窗格(在您的编辑框下方)确实很有帮助——在您提交之前向下滚动以查看我们将实际看到的内容。

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多