Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在HashMap中获取密钥的一部分?_Java_Loops_Hashmap - Fatal编程技术网

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

Java 如何在HashMap中获取密钥的一部分?,java,loops,hashmap,Java,Loops,Hashmap,!![一个txt文件示例][1] !![实际数字是多少][2] 我得到了一个文本fle iot.txt,我在其中输入了红色,并将其数据存储在地图中。 正如您在文本文件中看到的,我们有一个精确的周期“2004-11-28-2004-12-04”,然后是语言(Java、Python等),最后是一个整数(对这种语言感兴趣),这是这些语言的值。 如何只在年份中循环,不提及具体的一周。例如 反复浏览2004,获得最少的兴趣。反复浏览2006。此外,我还有2004-2015年的工作时间,那么是否有任何快速的

!![一个txt文件示例][1]

!![实际数字是多少][2]

我得到了一个文本fle iot.txt,我在其中输入了红色,并将其数据存储在
地图中。
正如您在文本文件中看到的,我们有一个精确的周期“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??
    }
    }
Map everything=newhashmap();
HashMap lang=新的HashMap();
for(字符串yr:iot.keySet())
{   
lang.put(yr,iot.get(yr.get(“JavaScript”).intValue());
一切。放(你,朗);
for(字符串yr04:iot.get(“2004”).keySet()//这就是我的prob
{
int minValueInMap=(Collections.min(everything.values());//min有smth错误
如果(entry.getValue()==minValueInMap)//无法解析条目??
{
System.out.println(entry.getKey());//无法解析条目??
}
}
但是,无法执行此操作,因为我的密钥按“2004-11-28-2004-12-04”的顺序排序。

您要查找的是一个称为
多映射的
:
将键映射到值的集合,类似于映射,但其中
每个键可能与多个值关联。您可以可视化
多重映射的内容,可以是从键到非空的映射
值集合:
a→ 1、2和
b→ 3

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

然后,当你在地图上写上完整的日期时,你也会把它放在
Multimap
中,只写上年份

您不希望循环通过
键集()
进行比较。
这将很快变得昂贵。如果您在构建另一个映射时构建
多映射
,那么您可以通过一个简单的方法调用
.get()快速查找给定年份中的所有内容
随着年份的推移,您将获得匹配数据的
列表
集合
,具体取决于您选择的
多映射
的哪个实现。

我建议使用更好的数据结构来表示您需要的内容。但是,如果失败,您可以按如下方式扩展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{
公共设置键开始使用(字符串s){
Set result=new HashSet();
for(字符串键:keySet()){
if(钥匙起动带){
结果。添加(键);
}
}
返回结果;
}
}
您可以使用以下内容,而不是使用地图>:

MyHashMap<HashMap<String, Integer>> myHashMap = new MyHashMap<>();
HashMap<String, Integer> data;
for(String yearRangeKey : myHashMap.keysStartingWith("2014") {
   data = myHashMap.get(yearRangeKey);
   ...
}
MyHashMap MyHashMap=newmyhashmap();
HashMap数据;
for(字符串yearRangeKey:myHashMap.keysStartingWith(“2014”){
data=myHashMap.get(yearRangeKey);
...
}
使用流:

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();
Map everything=newhashmap();
字符串year=“2004”;
int minInterest2004=everything.entrySet().stream()
.filter(e->e.getKey().startsWith(年))
.mapToInt(e->e.getValue().getInterest())
.min().getAsInt();

您必须循环查看整个
键集()
然后对每个键进行字符串比较,看看是否匹配。或者,您必须将数据存储在更适合您的查询的映射中。我认为您应该考虑在问题本身中添加代码和示例数据。我阅读了有关Multi-map的所有内容。在您发送给我的链接中,您可以给我一个示例,说明如何创建多个映射吗一个多重映射,并用键“2004”替换初始键“2004-11-28-2004-12-04”及其值。谢谢您不熟悉
.substring()
?是的,但我不知道它是如何工作的。然后你需要回去做一些补救性的研究,研究如何用一个键把东西放到地图上,这已经成为一个太宽泛的问题,无法给出具体的答案。在这一点上,你首先需要仔细看看我的问题,看看我的代码,可能会发现我已经知道如何把值放到地图上特殊密钥。我寻找的解决方案不需要超过10行代码。文档中的所有数据都非常大,无法将其全部放在新地图上。这就是为什么我简单地问如何仅通过“.substring[0]”或您称之为的任何名称(仅限年份)访问密钥.startswith方法对我也不起作用。抱歉。我现在正在阅读流的API。但无法了解您正在执行的操作。不过,如果您能解释代码不起作用的原因,那就太好了:.mapToInt(e->e.getValue().getInterest()//方法getInterest()对于HashMap类型未定义如果他们不知道如何应用
.startsWith()
.substring()
,仅将年份作为一个键使用,那么这就太过分了