Java 如何在HashMap中获取密钥的一部分?
!![一个txt文件示例][1] !![实际数字是多少][2] 我得到了一个文本fle iot.txt,我在其中输入了红色,并将其数据存储在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年的工作时间,那么是否有任何快速的
地图中。
正如您在文本文件中看到的,我们有一个精确的周期“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()
,仅将年份作为一个键使用,那么这就太过分了