在Hashmap中搜索list类型的值,检索列表元素并将其添加到要返回的新Collection中

时间:2017-04-28 16:03:07

标签: java hashmap treemap

我对Java很新,但我希望能够清除它。

我目前有一个类,在该类中我有一个名为“departments”的TreeMap,其参数为>:

TreeMap <String, List<String>> department;

在HR,Builders等各个部门中,有一份在那里工作的人员名单。如:

人力资源:珍妮特,琼斯,鲍勃

我想要做的是搜索部门以查找包含某个名为“bob”的人的所有部门(密钥),并将其添加到集合中以进行返回。

任何人都可以帮忙解决这个问题,我已经把头发拉了几天!到目前为止,我对这种方法的认识很远,但显然还远未完成!

public List<String> selectValues( String... aValue)

{

for(String eachDept : department.keySet()){
  Collection<String> peopleInTheDept = department.get(eachDept);
  for(String person : aValue){
      if(peopleInTheDept.contains(person)){
          result.add(person);
      }
  }
}
System.out.println(result);
}

4 个答案:

答案 0 :(得分:1)

就像OH GOD SPIDERS预测的那样,有一个Java 8流解决方案:

EF [Jan, Piet, Bert]
CD [Jan, Kees, Huub]

打印哪些:

Map<String, List<String>> result2 = new TreeMap<>();

for(String eachDept : department.keySet()){
    List<String> peopleInTheDept = department.get(eachDept);
    if(peopleInTheDept.contains(aValue)){
            result2.put(eachDept, department.get(eachDept));
    }
}
for (String s : result2.keySet()){
    System.out.println(s + " " + result2.get(s));
}

Pre Java 8解决方案:

{{1}}

这与我的Java 8代码完全相同。

答案 1 :(得分:0)

Java8的流当然是一个优雅的解决方案......但是如果你受限于使用java 8,那么你的部门的类型如何TreeMap<String, Set<String>>。如果你坚持使用一个非常类似的列表。只需将Set设置更改为List。 List接口中也有一个contains方法。

TreeMap<String, List<String>> departments = new TreeMap<String, List<String>>();
ArrayList<String> myList = new ArrayList<String>();
myList.add("person1");
departments.put("dep1", myList);
String[] aValue = {"person1","person2"};

public void selectValues( String... aValue)

{

  for(String eachDept : departments.keySet()){
      List<String> peopleInTheDept = departments.get(eachDept);
      for(String person : aValue){
          if(peopleInTheDept.contains(person)){
              result.add(person)
          }
      }
  }
  System.out.println(result);
}

可能有类似的东西吗?

答案 2 :(得分:0)

据我所知,您需要一个department列表,其值包含某个名称。这是Java 8版本的解决方案。

public static void main(String[] args) {
    // Initialization of map
    Map<String, List<String>> department = new TreeMap<>();
    department.put("HR", new ArrayList<>());
    department.put("ACC", new ArrayList<>());
    department.put("MK", new ArrayList<>());

    department.get("HR").add("bob");
    department.get("HR").add("John");

    department.get("ACC").add("Kim");
    department.get("ACC").add("bob");

    department.get("MK").add("XXX");

    // Here is the solution
    // depts is a list of string which contains the name of
    // department who's value contains 'bob'
    List<String > depts = department.entrySet()
            .stream()
            .filter(i -> i.getValue().contains("bob"))
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

    // Printing out the result
    depts.stream().forEach(System.out::println);
}

以传统方式

    List<String> depts = new ArrayList<>();
    for (Map.Entry<String , List<String >> it : 
            department.entrySet()) {
        if (it.getValue().contains("bob"))
            depts.add(it.getKey());
    }

答案 3 :(得分:0)

以下是一些java 8个Streams花式解决方案,用于获取信息并填写您的列表。

public void selectValues(String... values)
{
   for(String value : values) {
     results.addAll(department.entrySet()
         .stream()
         .filter(entry -> entry.getValue().contains(value))
         .map(entry -> entry.getKey())
         .collect(Collectors.toList()));
   }
}