Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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中搜索list类型的值,检索list元素并将其添加到要返回的新集合_Java_Hashmap_Treemap - Fatal编程技术网

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

Java 在Hashmap中搜索list类型的值,检索list元素并将其添加到要返回的新集合,java,hashmap,treemap,Java,Hashmap,Treemap,谈到Java,我是个新手,但我希望能澄清这一点 我目前有一个类,在该类中有一个名为“departments”的树状图,其参数为>: TreeMap <String, List<String>> department; TreeMap部门; 在每个部门,如人力资源、建筑商等,都有一份在那里工作的人员名单。例如: 人事:珍妮特、琼斯、鲍勃 我想做的是在部门中搜索,找到所有部门(键),例如包含一个叫“bob”的人,并将其添加到集合中以进行报税 有人能帮我吗?我已经拔头发好几

谈到Java,我是个新手,但我希望能澄清这一点

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

TreeMap <String, List<String>> department;
TreeMap部门;
在每个部门,如人力资源、建筑商等,都有一份在那里工作的人员名单。例如:

人事:珍妮特、琼斯、鲍勃

我想做的是在部门中搜索,找到所有部门(键),例如包含一个叫“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);
}
public List selectValues(字符串…aValue)
{
for(字符串eachDept:department.keySet()){
Collection peopleInTheDept=department.get(eachDept);
for(字符串人:aValue){
if(部门人员包含(人)){
结果:增加(人);
}
}
}
系统输出打印项次(结果);
}

Java8的streams无疑是一个优雅的解决方案……但是如果您受到Java8使用的限制,那么您的部门应该是
TreeMap
类型。如果你坚持使用一个列表,那就很相似了。只需将集合更改为列表。列表界面中也有一个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);
}
TreeMap departments=newtreemap();
ArrayList myList=新的ArrayList();
myList.添加(“人员1”);
部门。put(“dep1”,myList);
字符串[]aValue={“person1”,“person2”};
public void selectValues(字符串…aValue)
{
for(字符串eachDept:departments.keySet()){
列出peopleInTheDept=departments.get(eachDept);
for(字符串人:aValue){
if(部门人员包含(人)){
结果。添加(个人)
}
}
}
系统输出打印项次(结果);
}

可能与此类似?

就像上帝蜘蛛预测的那样,有一个Java 8流解决方案:

TreeMap <String, List<String>> department = new TreeMap<>();
department.put("AB", Arrays.asList("Bob", "Truus", "Miep"));
department.put("CD", Arrays.asList("Jan", "Kees", "Huub"));
department.put("EF", Arrays.asList("Jan", "Piet", "Bert"));
String aValue = "Jan";

Map<String,List<String>> result = department.entrySet().stream()
// filter out those departments that don't contain aValue
  .filter(entry -> entry.getValue().contains(aValue))
// collect the matching departments back into a map 
  .collect(Collectors.toMap(k -> k.getKey(), k -> k.getValue()));

// print the result
result.forEach((k,v)-> System.out.println(k + " " + v.toString()));
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));
}

Java 8之前的解决方案:

TreeMap <String, List<String>> department = new TreeMap<>();
department.put("AB", Arrays.asList("Bob", "Truus", "Miep"));
department.put("CD", Arrays.asList("Jan", "Kees", "Huub"));
department.put("EF", Arrays.asList("Jan", "Piet", "Bert"));
String aValue = "Jan";

Map<String,List<String>> result = department.entrySet().stream()
// filter out those departments that don't contain aValue
  .filter(entry -> entry.getValue().contains(aValue))
// collect the matching departments back into a map 
  .collect(Collectors.toMap(k -> k.getKey(), k -> k.getValue()));

// print the result
result.forEach((k,v)-> System.out.println(k + " " + v.toString()));
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));
}
Map result2=newtreemap();
for(字符串eachDept:department.keySet()){
列出peopleInTheDept=department.get(eachDept);
如果(人员所在部门包含(有效)){
结果2.put(eachDept,department.get(eachDept));
}
}
对于(字符串s:result2.keySet()){
System.out.println(s+“”+result2.get(s));
}

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

据我所知,您需要一个包含特定姓名的部门列表。以下是Java8版本的解决方案

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);
}
publicstaticvoidmain(字符串[]args){
//地图初始化
映射部门=新树映射();
department.put(“HR”,新ArrayList());
department.put(“ACC”,新ArrayList());
department.put(“MK”,新的ArrayList());
部门。获取(“HR”)。添加(“bob”);
部门。获取(“HR”)。添加(“John”);
部门获取(“ACC”)。添加(“Kim”);
部门获取(“ACC”)。添加(“bob”);
部门获取(“MK”)。添加(“XXX”);
//这是解决办法
//depts是一个字符串列表,其中包含
//部门谁的值包含“bob”
List depts=department.entrySet()
.stream()
.filter(i->i.getValue().contains(“bob”))
.map(map.Entry::getKey)
.collect(Collectors.toList());
//打印结果
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());
    }
List depts=new ArrayList();
对于(Map.Entry it:
department.entrySet()){
if(it.getValue()包含(“bob”))
depts.add(it.getKey());
}

以下是一些
java
8流奇特的解决方案,用于获取信息并填写您的列表

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()));
   }
}

你的
akey
我想要搜索的人的列表对吗?没错,抱歉刚刚编辑并更新了以反映Avalue为什么要将数组传递给
get
方法?它不应该是
String
作为键吗?对于
containsValue
来说同样的事情
部门的值是
列表
而不是数组。另一个问题是,您没有存储从
get
方法中检索到的值,也没有对其进行任何操作。很快可能会有人发布一些奇特的java 8流解决方案,但手动的java 8之前的解决方案将是迭代您的entrySet(department.entrySet())在我看来,更合理的做法是将地图绘制为
TreeMap
,遍历每个部门,搜索列表中的每个值
aValue
是否有一个非Java 8的答案?它是,但它没有编译:/@JamesPalfrey在我的答案中添加了一个Java 8之前的解决方案。它编译了,但我没有打印出来?@JamesPalfrey最后三个答案行为我打印结果。我知道它大致应该是这样的,但不太确定如何填充它:public List findCustomersInArea(int x){//创建一个列表来存储所有客户列表x=x();//迭代映射中的所有条目(x.x:x.x()){//获取客户x=x.x();if(x.x()==x){//执行需要添加到列表中的操作x.x(x);}}//返回包含所有x的列表返回x;您的部门是否为`TreeMap departments=new TreeMap()类型'?它是TreeMap department类型;编辑了我的答案以提供更多说明。感谢向导,我无法将TreeMap更改为使用集合而不是列表集合,因为它会放弃其他方法…周围是否仍有使用列表的方法?当然,我建议设置只是为了让您的搜索更高效…更新答案以使用列表.