스트림 및 람다를 사용하여 여러 컬렉션을 단일 컬렉션으로 축소하려고합니다. 그러나 중복 된 히트가 발생한 곳이면 어디든 나타낼 필요가 있습니다. 기본적으로여러 개의 목록을 스트림 및 lambas와 결합하여 중복 위치를 나타내는 방법
나는 다음과 같은 상황이 : 고객의
컬렉션 1 (모든 사람) 종업원의 전망
의Person 1 (Tom)
Person 2 (Bob)
Person 3 (Joe)
컬렉션이
Person 1 (Mike)
Person 2 (Wilbur)
Person 3 (Joe)
컬렉션 3
Person 1 (Mike)
Person 2 (Tony)
Person 3 (Sue)
Person 4 (Joe)
나는지도를 사용 할 수있는 새로운 분야 포함하는 컬렉션을 변환하고 싶습니다 - 최종 결과이
컬렉션 같은 것 있도록 평평하게하는 방법을 실제로 내가 잃어버린 얻고됩니다
Person 1 (Tom, "Customer")
Person 2 (Bob, "Customer")
Person 3 (Joe, "Customer, Prospect, Employee")
Person 4 (Mike, "Prospect, Employee")
Person 5 (Wilbur, "Prospect")
Person 6 (Tony, "Employee")
Person 7 (Sue, "Employee")
나는 속한 영역을 시각적으로 나타 내기 위해 문자열 값을 만들 계획입니다.
고마워요!
[편집] 아래의 제안을 바탕으로
, 내가 솔루션이 방법을 테스트 할 수 있었다 ...
클래스 TestOutFlatMap { 공공 무효 시험() {
Map<String, Collection<Person>> map = new HashMap<>();
Collection<Person> p1 = new ArrayList<>();
p1.add(new Person("Mike"));
p1.add(new Person("Joe"));
p1.add(new Person("Tony"));
Collection<Person> p2 = new ArrayList<>();
p1.add(new Person("Wilbur"));
p1.add(new Person("Joe"));
p1.add(new Person("Molly"));
Collection<Person> p3 = new ArrayList<>();
p1.add(new Person("Wilbur"));
p1.add(new Person("Joe"));
p1.add(new Person("Bubba"));
map.put("Customer", p1);
map.put("Prospect", p2);
map.put("Employee", p3);
Map<Person, String> output = map
.entrySet()
.stream()
.flatMap(t -> t.getValue().stream().map(g -> new Pair<>(t.getKey(), g)))
.collect(Collectors.toMap(t -> t.getValue(), u -> u.getKey(), (x, y) -> x + ", " + y));
output.keySet().stream().forEach(p -> {
System.out.println(p);
System.out.println(output.get(p));
});
}
class Person {
String name;
Person(String name){
this.name = name;
}
public String toString() {return this.name;}
@Override
public int hashCode() {
int hash = 5;
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Person other = (Person) obj;
if (!Objects.equals(this.name, other.name)) {
return false;
}
return true;
}
};
}
그러나 내 결과는 기대와 달랐습니다. 그들은 다음과 같이 반환했습니다 :
Bubba
Customer
Molly
Customer
Wilbur Customer, Customer
Tony Customer
Joe Customer, Customer, Customer
Mike Customer
잘못 연결된 부분이 표시되지 않습니다.
팁 주셔서 감사합니다 - 불행히도 둘 다 나에게 "추론 변수 K가 호환되지 않는 경계를 가지고 있습니다"그리고이 하나의 유형 " (Collector super T, A, R>)의 유형은 errorneous입니다"컴파일시 오류가 발생했습니다. –
, @purringpigeon, 나는'map'에 대해 잘못된 유형을 가졌습니다. 내 대답을 수정했습니다 –
이것은 이상한 일입니다 - 첫 번째 예제를 실행하면 동일한 결과를 얻습니다 ... 콜렉터는 동일한 문자열을 반복해서 반복합니다 ... Joe "Customer, Customer, Customer" Joe, "고객, 잠재 고객, 직원". 두 번째 예제는 "고객"이라고 말하기 위해 문자열을 접습니다. –