我有一个HashMap,其中键的类型为Double
,我的自定义对象为值。
它看起来像这样:
private static Map<Double, Incident> incidentHash = new HashMap<>();
Incident
对象具有以下属性:String date
,String address
,String incidentType
。
现在我从用户那里获得了String date
作为输入,我想检查HashMap中是否存在任何事件,并且该用户输入了日期。 HashMap中可能存在许多具有给定日期的事件,但只要在给定日期内至少有一个事件,我就可以*
东西。
我可以迭代HashMap中的所有值并检查给定日期是否存在但我想知道是否有更好更有效的方法而不修改数据结构。
答案 0 :(得分:1)
您可以使用流API(来自Java8),如下面的代码所示,带有内联注释:
String userInput="10-APR-2017";
Optional<Map.Entry<Double, Incident>> matchedEntry =
incidentHash.entrySet().stream().
//filter with the condition to match
filter(element -> element.getValue().getDate().equals(userInput)).findAny();
//if the entry is found, do your logic
matchedEntry.ifPresent(value -> {
//do something here
});
如果您正在寻找JDK1.8之前的内容,可以参考以下代码:
String userInput="10-APR-2017";
Set<Map.Entry<Double, Incident>> entries = incidentHash.entrySet();
Map.Entry<Double, Incident> matchedEntry = null;
for(Iterator<Map.Entry<Double, Incident>> iterator = entries.iterator();
iterator.hasNext();) {
Map.Entry<Double, Incident> temp = iterator.next();
if(temp.getValue().getDate().equals(userInput)) {
matchedEntry = temp;
break;
}
}
答案 1 :(得分:1)
鉴于您的HashMap, NO ,没有其他方法可以而不迭代HashMap 。
至于更改结构,您可以按Map<String, List<Incident>>
的方式执行,根据您的要求,您将获得date
作为关键字和List
个事件的事件:{{ 1}}。
所以这将是There can be many Incidents in the HashMap with the given date
O(1)
答案 2 :(得分:0)
您可以在自定义TreeMap中使用Comparator。在比较器中比较日期值。
答案 3 :(得分:0)
您必须遍历地图,直到找到匹配的数据。由于您只需要知道是否存在任何事件,您可以在找到匹配时退出循环,而不是迭代地图的其余部分。
答案 4 :(得分:0)
您只能保留第二个与对象属性匹配的Hash / TreeMap,因此您也可以快速检查此属性。但是你必须为你想要快速访问的每个属性策划一个这样的地图。这使得它更复杂并且使用更多内存,但速度要快得多。
如果这不是一个选项,其他答案中引用的流API是一种漂亮而整洁的方式来迭代所有对象以搜索属性。
private static Map<Double, Incident> incidentHash = new HashMap<>();
private static Map<String, List<Incident>> incidentsPerDayMap = new HashMap<>();
答案 5 :(得分:0)
鉴于您不希望iterate
使用地图并且目前只有 方式来获取所需的值,我建议您推荐包含{{}的其他Map
{1}}为关键字,Date
为值。它可以是List<Incident>
,例如:
TreeMap
只要条目被添加到原始Map<Date, List<Incident>> incidents = new TreeMap<>();
中,您就可以put
此Map
中的条目,例如:
Map
用户输入Incident incident = ;// incident object
Date date; //Date
incidents.computeIfAbsent(date, t -> new ArrayList<>()).add(incident);
后,您只需Date
即可获得属于此日期的所有事件。虽然这会给你一个incidents.get()
而 仍然 需要迭代它,但它将包含更少的元素和list
方法{ {1}}将保证您排序时的get
复杂性。因此,您的搜索操作将更加高效。