如何在HashMap中获取密钥的一部分?

时间:2015-11-26 01:11:45

标签: java loops hashmap

![txt文件示例] [1] http://dox.bg/files/dw?a=f49baaafee

! [实际上是什么数字] [2] http://dox.bg/files/dw?a=a911da0422

我有一个文本fle iot.txt,我在其中红色并将其数据存储在Map<String, HashMap<String, Integer>>中。 正如您在文本文件中看到的那样,我们有一个确切的句号“2004-11-28 - 2004-12-04”然后是语言(Java,Python等),最后是一个整数(对这种语言感兴趣),是这些语言的价值。 如何循环多年,不提具体周。例如 通过 2004 进行迭代并获得最少的兴趣。通过 2006 进行迭代。另外,我有2004 - 2015年的年份,所以有没有快速的方法循环所有年份? 我想知道做那样的事情:

Map<String, HashMap<String, Integer>> everything = new HashMap<>();
    HashMap<String, Integer> lang = new HashMap<>();
    for(String yr: iot.keySet())
    {   
    lang.put(yr, iot.get(yr).get("JavaScript").intValue());
    everything.put(yr, lang);

    for(String yr04 : iot.get("2004").keySet())  //this is where I have prob
    {
    int minValueInMap=(Collections.min(everything.values()));  // there is smth wrong with "min" 
    if (entry.getValue()==minValueInMap)  //entry cannot be resolved??
    {
        System.out.println(entry.getKey());  //entry cannot be resolved??
    }
    }

然而,由于我的按键分类如“2004-11-28 - 2004-12-04”,因此无法完成。

3 个答案:

答案 0 :(得分:0)

您要找的是Multimap

  

将键映射到值的集合,类似于Map,但在其中   每个键可以与多个值相关联。你可以想象出来   multimap的内容,可以是从keys到非空的映射   价值集合:a → 1, 2b → 3

如果您希望数据可以通过本机密钥和年份进行搜索,则必须将数据存储在两个地图中。

然后,当您在地图中添加完整日期的某些内容时,您还会将其放入Multimap只有一年的时间。

Guava has something called a Multimap that is perfect for this.

您不想循环执行keySet()比较。

这将很快变得昂贵。如果您在构建其他地图时构建Multimap,那么您可以非常快速地查找给定年份中的所有内容,只需使用一年的简单方法调用.get(),您就可以获得回复匹配数据的ListSet取决于您选择的Multimap的实现。

答案 1 :(得分:0)

我建议使用更好的数据结构来表示您的需求。但是,如果不能像下面那样扩展HashMap:

&#xA;&#xA;
 公共类MyHashMap&lt; V&gt;扩展HashMap&lt; String,V&gt; {&#XA;&#XA; public Set&lt; String&gt; keysStartingWith(String s){&#xA;设置&LT;字符串&GT; result = new HashSet&lt; String&gt;();&#xA; for(String key:keySet()){&#xA; if(key.startsWith(s)){&#xA; result.add(键);&#XA; }&#XA; }&#XA;返回结果;&#xA; }&#xA;}&#xA;  
&#xA;&#xA;

您可以使用:

&#xA;&#xA而不是使用地图> ;
  MyHashMap&lt; HashMap&lt; String,Integer&gt;&gt; myHashMap = new MyHashMap&lt;&gt;();&#xA; HashMap&lt; String,Integer&gt; data;&#xA; for(String yearRangeKey:myHashMap.keysStartingWith(“2014”){&#xA; data = myHashMap.get(yearRangeKey);&#xA; ...&#xA;}&#xA; < /代码> 
&#XA;

答案 2 :(得分:0)

使用流:

Map<String, HashMap<String, Integer>> everything = new HashMap<>();
String year = "2004";
int minInterest2004 = everything.entrySet().stream()
  .filter(e -> e.getKey().startsWith(year))
  .mapToInt(e -> e.getValue().getInterest())
  .min().getAsInt();