我对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);
}
答案 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()));
}
}