0

我知道已经有关于这件事的主题,但他们都没有真正回答我的问题。有没有办法做到这一点?如果我有一个使用字符串作为键和 TreeSet 类的对象作为值的 TreeMap,有没有办法可以将一些 int 添加到与特定键关联的集合中?

那么我应该做的是使用 TreeMap 和 TreeSet 类从文本文件中进行索引。我的计划是使用 TreeMap 键作为文本文件中的单词,值将是单词出现的行号集。因此,您逐步浏览文本文件,每次收到一个单词时,您都会检查 TreeMap 以查看您是否已经拥有该密钥,如果没有,则将其添加并创建一个以您所在的行号开头的新 TreeSet上。如果您已经拥有它,那么您只需将行号添加到集合中。所以你看我需要做的是访问集合的 .add() 函数

就像是

map.get(identifier).add(lineNumber);

我知道这不起作用,但我该怎么做?我的意思是,如果有一种更简单的方法来做我想做的事情,我会很乐意这样做,但我仍然想知道如何以这种方式去做,只是因为你知道学习和经验等等.

4

4 回答 4

1

考虑以下逻辑(我假设输入字在一个数组中):

TreeMap<String, TreeSet<Integer>> index = new TreeMap<String, TreeSet<Integer>>();
for (int pos = 0; pos < input.length; pos++) {
    String word = input[pos];
    TreeSet<Integer> wordPositions = index.get(word);
    if (wordPositions == null) {
        wordPositions = new TreeSet<Integer>();
        index.put(word, wordPositions);
    }
    wordPositions.add(pos);
} 

这会产生您需要的索引,该索引从字符串映射到字符串出现的位置集。根据您的具体需求,可以将外部/内部数据结构分别更改为 HashMap/HashSet。

于 2013-03-26T14:02:14.973 回答
0

如果我理解正确,您希望有一个树图,其中每个键都引用一个树集,用于存储该键出现的行号。这绝对是可行的,而且实现起来非常简单。我不确定你为什么map.get(identifier).add(lineNumber);不工作。我会这样做:

TreeMap<String, TreeSet<Integer>>  map = new TreeMap<String, TreeSet<Integer>>();
        TreeSet<Integer> set = new TreeSet<Integer>();
        set.add(1234);
        map.put("hello", set);
        map.get("hello").add(123);

一切正常。

于 2013-03-26T14:03:32.143 回答
0

为什么不使用and Map,例如:StringArrayList<int>

Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

然后总是当你得到一个单词时,你检查它是否已经存在,Map如果它确实存在,你将行号添加到,如果不存在,你在给定的单词和给定的行号List中创建一个新条目。Map

if (map.get(word ) != null) {
    map.get(word).add(line);
}
else{
    final List<Integer> list = new ArrayList<Integer>();
    list.add(line);
    map.put(word, list);
}
于 2013-03-26T14:00:40.320 回答
0

您的构造不起作用的唯一原因是结果map.get(identifier)可以为空。就个人而言,我喜欢@EyalSchneider 回答的惰性初始化解决方案。但是,如果您提前知道所有标识符,还有另一种选择:例如,如果您预加载Map所有已知的英语单词。然后您可以执行以下操作:

for (String word : allEnglishWords) {
    map.put(word, new LinkedList<Integer>);
}

for (int pos = 0; pos < input.length; pos++) {
    String word = input[pos];
    map.get(word).add(pos);
}
于 2013-03-26T14:12:23.573 回答