java:检查HashMap值中是否存在对象的属性

时间:2017-04-08 22:48:25

标签: java data-structures hashmap

我有一个HashMap,其中的类型为Double,我的自定义对象为。 它看起来像这样:

private static Map<Double, Incident> incidentHash = new HashMap<>();

Incident对象具有以下属性:String dateString addressString incidentType

现在我从用户那里获得了String date作为输入,我想检查HashMap中是否存在任何事件,并且该用户输入了日期。 HashMap中可能存在许多具有给定日期的事件,但只要在给定日期内至少有一个事件,我就可以* 东西

我可以迭代HashMap中的所有值并检查给定日期是否存在但我想知道是否有更好更有效的方法而不修改数据结构。

6 个答案:

答案 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<>(); 中,您就可以putMap中的条目,例如:

Map

用户输入Incident incident = ;// incident object Date date; //Date incidents.computeIfAbsent(date, t -> new ArrayList<>()).add(incident); 后,您只需Date即可获得属于此日期的所有事件。虽然这会给你一个incidents.get() 仍然 需要迭代它,但它将包含更少的元素和list方法{ {1}}将保证您排序时的get复杂性。因此,您的搜索操作将更加高效。