import java.util.List ;
import java.util.Map ;
import java.util.Set ;
import java.util.function.Function ;
import java.util.stream.Collectors ;
class Department {
public Department
( String deptId
) { this .deptId = deptId;
}
return deptId;
}
@Override
return "Department [deptId=" + deptId + "]" ;
}
}
class Employee {
List< Department> departments;
public Employee
( String empId, List
< Department
> departments
) { this .empId = empId;
this .departments = departments;
}
return empId;
}
public List< Department> getDepartments( ) {
return departments;
}
@Override
return "Employee [empId=" + empId + ", departments=" + departments + "]" ;
}
}
public class Main {
public static void main
( String [ ] args
) { Department a = new Department( "a" ) ;
Department b = new Department( "b" ) ;
Department c = new Department( "c" ) ;
Employee e1
= new Employee
( "e1" ,
List .
of ( a, b
) ) ; Employee e2
= new Employee
( "e2" ,
List .
of ( c, b
) ) ; Employee e3
= new Employee
( "e3" ,
List .
of ( c, a
) ) ; Employee e4
= new Employee
( "e4" ,
List .
of ( a, b, c
) ) ;
List
< Employee
> employees
= List .
of ( e1, e2, e3, e4
) ; Set< Department> departments = employees.stream ( ) .flatMap ( employee -> employee.getDepartments ( ) .stream ( ) )
.collect ( Collectors.toSet ( ) ) ;
Map< Department, List< Employee>> map =
departments.stream ( )
.collect ( Collectors.toMap (
Function.identity ( ) ,
d -> employees.stream ( ) .filter ( e -> e.getDepartments ( ) .contains ( d) ) .collect ( Collectors.toList ( ) )
)
) ;
map.
entrySet ( ) .
forEach ( System .
out :: println
) ; }
}
aW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CgpjbGFzcyBEZXBhcnRtZW50IHsKCVN0cmluZyBkZXB0SWQ7CgoJcHVibGljIERlcGFydG1lbnQoU3RyaW5nIGRlcHRJZCkgewoJCXRoaXMuZGVwdElkID0gZGVwdElkOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0RGVwdElkKCkgewoJCXJldHVybiBkZXB0SWQ7Cgl9CgoJQE92ZXJyaWRlCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiAiRGVwYXJ0bWVudCBbZGVwdElkPSIgKyBkZXB0SWQgKyAiXSI7Cgl9Cn0KCmNsYXNzIEVtcGxveWVlIHsKCVN0cmluZyBlbXBJZDsKCUxpc3Q8RGVwYXJ0bWVudD4gZGVwYXJ0bWVudHM7CgoJcHVibGljIEVtcGxveWVlKFN0cmluZyBlbXBJZCwgTGlzdDxEZXBhcnRtZW50PiBkZXBhcnRtZW50cykgewoJCXRoaXMuZW1wSWQgPSBlbXBJZDsKCQl0aGlzLmRlcGFydG1lbnRzID0gZGVwYXJ0bWVudHM7Cgl9CgoJcHVibGljIFN0cmluZyBnZXRFbXBJZCgpIHsKCQlyZXR1cm4gZW1wSWQ7Cgl9CgoJcHVibGljIExpc3Q8RGVwYXJ0bWVudD4gZ2V0RGVwYXJ0bWVudHMoKSB7CgkJcmV0dXJuIGRlcGFydG1lbnRzOwoJfQoKCUBPdmVycmlkZQoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIkVtcGxveWVlIFtlbXBJZD0iICsgZW1wSWQgKyAiLCBkZXBhcnRtZW50cz0iICsgZGVwYXJ0bWVudHMgKyAiXSI7Cgl9Cn0KCnB1YmxpYyBjbGFzcyBNYWluIHsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlEZXBhcnRtZW50IGEgPSBuZXcgRGVwYXJ0bWVudCgiYSIpOwoJCURlcGFydG1lbnQgYiA9IG5ldyBEZXBhcnRtZW50KCJiIik7CgkJRGVwYXJ0bWVudCBjID0gbmV3IERlcGFydG1lbnQoImMiKTsKCgkJRW1wbG95ZWUgZTEgPSBuZXcgRW1wbG95ZWUoImUxIiwgTGlzdC5vZihhLCBiKSk7CgkJRW1wbG95ZWUgZTIgPSBuZXcgRW1wbG95ZWUoImUyIiwgTGlzdC5vZihjLCBiKSk7CgkJRW1wbG95ZWUgZTMgPSBuZXcgRW1wbG95ZWUoImUzIiwgTGlzdC5vZihjLCBhKSk7CgkJRW1wbG95ZWUgZTQgPSBuZXcgRW1wbG95ZWUoImU0IiwgTGlzdC5vZihhLCBiLCBjKSk7CgoJCUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IExpc3Qub2YoZTEsIGUyLCBlMywgZTQpOwoJCVNldDxEZXBhcnRtZW50PiBkZXBhcnRtZW50cyA9IGVtcGxveWVlcy5zdHJlYW0oKS5mbGF0TWFwKGVtcGxveWVlIC0+IGVtcGxveWVlLmdldERlcGFydG1lbnRzKCkuc3RyZWFtKCkpCgkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOwoKCQlNYXA8RGVwYXJ0bWVudCwgTGlzdDxFbXBsb3llZT4+IG1hcCA9IAoJCQkJZGVwYXJ0bWVudHMuc3RyZWFtKCkKCQkJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoCgkJCQkJCQkJCQlGdW5jdGlvbi5pZGVudGl0eSgpLAoJCQkJCQkJCQkJZCAtPiBlbXBsb3llZXMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gZS5nZXREZXBhcnRtZW50cygpLmNvbnRhaW5zKGQpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpCgkJCQkJCQkJCSkKCQkJCQkJCSk7CgoJCW1hcC5lbnRyeVNldCgpLmZvckVhY2goU3lzdGVtLm91dDo6cHJpbnRsbik7Cgl9Cn0=
stdout
Department [deptId=c]=[Employee [empId=e2, departments=[Department [deptId=c], Department [deptId=b]]], Employee [empId=e3, departments=[Department [deptId=c], Department [deptId=a]]], Employee [empId=e4, departments=[Department [deptId=a], Department [deptId=b], Department [deptId=c]]]]
Department [deptId=a]=[Employee [empId=e1, departments=[Department [deptId=a], Department [deptId=b]]], Employee [empId=e3, departments=[Department [deptId=c], Department [deptId=a]]], Employee [empId=e4, departments=[Department [deptId=a], Department [deptId=b], Department [deptId=c]]]]
Department [deptId=b]=[Employee [empId=e1, departments=[Department [deptId=a], Department [deptId=b]]], Employee [empId=e2, departments=[Department [deptId=c], Department [deptId=b]]], Employee [empId=e4, departments=[Department [deptId=a], Department [deptId=b], Department [deptId=c]]]]