【问题标题】:How can I get a part of a key in HashMap? [closed]如何在 HashMap 中获取键的一部分? [关闭]
【发布时间】:2015-11-26 01:11:45
【问题描述】:

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

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

我得到了一个文本文件 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”,因此无法完成。

【问题讨论】:

  • 您必须遍历整个keySet(),然后对每个键进行字符串比较以查看是否匹配。或者,您必须将数据存储在更适合您查询的地图中。
  • 我认为您应该考虑在问题本身中添加代码和示例数据。

标签: java loops hashmap


【解决方案1】:

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

public class MyHashMap<V> extends HashMap<String,V> {

    public Set<String> keysStartingWith(String s) {
        Set<String> result = new HashSet<String>();
        for(String key : keySet()) {
            if(key.startsWith(s)) {
                result.add(key);
            }
        }
        return result;
    }
}

您将使用:而不是使用地图>:

MyHashMap<HashMap<String, Integer>> myHashMap = new MyHashMap<>();
HashMap<String, Integer> data;
for(String yearRangeKey : myHashMap.keysStartingWith("2014") {
   data = myHashMap.get(yearRangeKey);
   ...
}

【讨论】:

    【解决方案2】:

    您要查找的内容称为Multimap

    将键映射到值的集合,类似于 Map,但在其中 每个键可能与多个值相关联。您可以可视化 多重映射的内容作为从键到非空的映射 值集合:a → 1, 2b → 3

    如果您希望通过本地键和年份搜索数据,则必须将数据存储在两个地图中。

    然后,当您在地图中放入带有完整日期的内容时,您也将其放入 Multimap 中并仅带有年份。

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

    您不想循环通过 keySet() 进行比较。

    这将很快变得昂贵。如果您在构建另一张地图时构建Multimap,那么您可以通过一个简单的方法调用.get() 快速查找给定年份的所有内容,您将获得ListSet 的匹配数据取决于您选择的Multimap 的实现。

    【讨论】:

    • 我阅读了有关 Multi Map 的所有内容。在您发送给我的链接中,您能否给我一个示例,如何制作多地图并将初始键 "2004-11-28 - 2004-12-04" 及其值替换为键 "2004" 。谢谢
    • 你不熟悉.substring()吗?
    • 是的,我是,但我不知道它会如何工作。
    • 那么你需要回去做一些关于如何用钥匙把东西放入地图的补救研究,这已经成为一个过于宽泛的问题,目前无法给出具体答案
    • 您首先需要仔细查看我的问题,查看我的代码,可能会发现我已经知道如何将值放入特定的键中。我寻找了一个不会超过 10 行代码的解决方案。文档中的整个数据都非常大,无法将其全部放在新地图上。这就是为什么我只是问我如何通过“.substring[0]”或任何你称之为的(只是年份)来访问密钥。 .startswith 方法对我也不起作用。
    【解决方案3】:

    使用流:

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

    【讨论】:

    • 对不起。我现在正在阅读流的 API。但无法得到你在做什么。但是,如果您向我解释为什么代码不起作用会很好: .mapToInt(e -> e.getValue().getInterest()) // HashMap 类型的方法 getInterest() 未定义
    • 如果他们不明白如何申请 .startsWith().substring() 来取消一年并将其用作关键,这将是他们头疼的事情
    猜你喜欢
    • 1970-01-01
    • 2019-10-24
    • 2018-11-29
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多