Java 一个HashMap怎么可能只包含一个条目/对象?
我想要一个只有一个键值对象的Java 一个HashMap怎么可能只包含一个条目/对象?,java,hashmap,Java,Hashmap,我想要一个只有一个键值对象的HashMap 我创建了以下HashMap: HashMap <Integer,String>DocsCollection = new HashMap <Integer,String>(); 谢谢,事先Map方法可能不是最好的。问题是您正在更改键值 注意,最好只是有一个列表,每次匹配单词时,只需将文件添加到列表中即可。您可以使用list.size()轻松获得计数。我将尝试为您的任务提出一个稍微不同的解决方案: 你有单词(你好等) 您
HashMap
我创建了以下HashMap
:
HashMap <Integer,String>DocsCollection = new HashMap <Integer,String>();
谢谢,事先Map方法可能不是最好的。问题是您正在更改键值
注意,最好只是有一个
列表
,每次匹配单词时,只需将文件添加到列表中即可。您可以使用list.size()
轻松获得计数。我将尝试为您的任务提出一个稍微不同的解决方案:
- 你有单词(
等)你好
- 您要计算在其中找到的文件数量
- 你想知道这些文件吗
map.put(“hello”,“file1.txt”);put(“hello”,“file2.txt”)代码>
-获取找到每个单词的次数map.keys().count(“hello”)
返回包含该单词的所有文件的map.get(“hello”)
集合
你可以在地图上有任意多的单词。如果每个映射需要一个条目,那么X个单词就需要X个映射。这里有一个使用单个键/值的映射的想法:创建映射,添加单个键-值对,然后使用使其不可修改。这样,就无法将其他元素添加到地图中。像这样:
HashMap<Integer, String> docsCollection = new HashMap<Integer, String>();
docsCollection.put(2, "foo.txt,hello.txt");
docsCollection = Collections.unmodifiableMap(docsCollection);
HashMap docscolection=newhashmap();
put(2,“foo.txt,hello.txt”);
docscolection=Collections.unmodifiableMap(docscolection);
只有在事先知道键/值的情况下,这才有效;调用unmodifiableMap
后,映射将被有效冻结,您将无法从中添加/删除更多元素
现在,您在问题中提出的问题不适合使用地图,这不是本例中使用的正确数据结构。最好使用
ArrayList
,将找到单词的文件名添加到列表中,并使用列表的size()
方法确定找到单词的文件数。是否需要使用HashMap?您可以使用int(用于计数)和String或StringBuffer(用于文件名)并更新它们
或者,您可以有一个列表,每次找到某个文件时,您都可以在其中添加文件名。要获取计数,请使用List.size()。但是我看到@hvgotcodes已经在这个想法上击败了我。可以说,你没有真正使用
哈希映射:你的计数器不是真正的键
根据您的解释,您似乎需要一个表示搜索结果的对象,例如:
public class SearchResult {
private String searchedWord;
private long counter;
private List<String> containingFiles;
// ...
}
公共类搜索结果{
私有字符串搜索词;
私人长柜台;
包含文件的私有列表;
// ...
}
为确保您想要的功能正常运行:
将值声明为列表
每次找到一个单词时,删除原始的键/值对,并用新内容替换它
比如:
HashMap<Integer, List<String>> map = new HashMap<Integer, List<String>>();
// some loop
if(/* new word found */) {
Integer key = (Integer)map.keySet().toArray()[0];
List<String> value = (List<String>)map.get(key);
value.add(word);
map.remove(key);
map.put((key + 1), value);
}
HashMap map=newhashmap();
//一些循环
如果(/*找到新单词*/){
整数键=(整数)map.keySet().toArray()[0];
List value=(List)map.get(key);
增值(字);
地图。删除(键);
map.put((键+1),值);
}
这不是好办法
尝试使用映射
,其中键是关键字,值是找到关键字的文件集。然后,添加到它将看起来像:
//further up
final Map<String, Set<String>> map = new HashMap<String, Set<String>>();
//then:
public void addRef(final String keyword, final String filename)
{
if (!map.containsKey(keyword)) // keyword not encountered yet
map.put(keyword, new HashSet<String>());
map.get(keyword).add(filename);
}
请注意,这是完全迟钝的>请尝试以下方法:
DocsCollection = Collections.singletonMap(2, "foo.txt,hello.txt");
无法修改此地图,如果要修改,请执行以下操作:
DocsCollection = Collections.singletonMap(3, "foo.txt,hello.txt");
从历史上看,标准Java提供的数据结构很少。apachecollections已经在很多场合被同时使用,以添加我们觉得缺少的这些额外的数据结构。我认为这里的OP案例就是其中之一。是的,HashMap不是正确的方法,OP对问题的建模是错误的
对于映射中的一个键、值对的情况,这通常正是我们所需要的:一对或更一般地说是一个元组。如果“键”和“值”对于我们需要的数据结构的每个实例通常都具有相同的数据类型,那么这种方法非常有效
我将提到(虽然有很多好的信息,但它本身是一个副本)在Java中如何使用元组的历史。可以使用的补充类的一个例子是org.apache.commons.lang3.tuple
,我认为您不太了解哈希表的用途。(不是这样)。在我看来,地图并不是你想要做的事情的正确方法……如果他在搜索多个单词,这是一个很好的解决方案。但是对于一个单词,一个列表或数组就可以了…列表会很快吗?因为我有大约60个文件,在我为每个单词创建列表之后,我需要快速完成工作,我必须遍历列表,并为每个单词连接列表中的每个文件。假设我有10000个单词,每个单词出现在10个文件中,这意味着我将创建10000个列表,每个列表包含10个条目。之后,我必须为每个单词写入一个随机访问文件,每个单词都出现在这个文件中。“Hello”5“file1、file2、file3、file4、file5”等。为了找到每个单词的文件,我必须遍历整个列表。这不是有点慢吗?如果只有一对60个条目,那不是更好吗?你可以复制列表三次,每次添加一个元素时都做侧手翻,但仍然花费很少的时间,这对你来说是瞬间的。听说过克努斯关于优化的话吗?你的瓶颈在于你如何处理这些字符串,而不是如何存储它们(如果你想找到包含该单词的所有文件,你仍然必须检查所有文件,不管你如何存储这些文件)。为什么你认为它会开始
public class YourClass {
private HashMap<Integer, String> occurrences = new HashMap<Integer, String>(1);
public void addFile(String name) {
int count = 0;
String names = "";
if(occurrences.size() > 0) {
count = (int)(occurrences.keySet().toArray()[0]);
names = occurrences.get(count);
names += ",";
}
count++;
names += name;
occurrences.remove(count);
occurrences.put(count, names);
}
}
addFile("hello.txt");
DocsCollection = Collections.singletonMap(2, "foo.txt,hello.txt");
DocsCollection = Collections.singletonMap(3, "foo.txt,hello.txt");