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");