我想从一个未排序的列表中获得一个使用两个字段(州和市)的排序地图。
class StateMunicipality {
private StateMunicipalityId id;
private String nameState;
private String nameMunicipality;
public StateMunicipality(StateMunicipalityId id, String nameState, String nameMunicipality) {
this.id = id;
this.nameState = nameState;
this.nameMunicipality = nameMunicipality;
}
public StateMunicipalityId getId() {
return id;
}
public void setId(StateMunicipalityId id) {
this.id = id;
}
public String getNameState() {
return nameState;
}
public void setNameState(String nameState) {
this.nameState = nameState;
}
public String getNameMunicipality() {
return nameMunicipality;
}
public void setNameMunicipality(String nameMunicipality) {
this.nameMunicipality = nameMunicipality;
}
@Override
public String toString() {
return id + ", nameState=" + nameState + ", nameMunicipality=" + nameMunicipality;
}
}
身份证
class StateMunicipalityId {
private Long codeState;
private Long codeMunicipality;
public StateMunicipalityId(Long codeState, Long codeMunicipality) {
this.codeState = codeState;
this.codeMunicipality = codeMunicipality;
}
public Long getCodeState() {
return codeState;
}
public void setCodeState(Long codeState) {
this.codeState = codeState;
}
public Long getCodeMunicipality() {
return codeMunicipality;
}
public void setCodeMunicipality(Long codeMunicipality) {
this.codeMunicipality = codeMunicipality;
}
@Override
public String toString() {
return "codeState=" + codeState + ", codeMunicipality=" + codeMunicipality;
}
}
现在我正在填充一个列表
System.out.println("Example unsorted List");
List<StateMunicipality> statmuns = new ArrayList<>();
statmuns.add(new StateMunicipality(new StateMunicipalityId(1L, 1L), "Atlántico", "Barranquilla"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(3L, 3L), "Antioquia", "Envigado"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(2L, 3L), "Valle", "Yumbo"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(3L, 2L), "Antioquia", "ItagüÃ"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(2L, 1L), "Valle", "Cali"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(3L, 1L), "Antioquia", "MedellÃn"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(1L, 2L), "Atlántico", "Soledad"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(1L, 3L), "Atlántico", "Puerto Colombia"));
statmuns.add(new StateMunicipality(new StateMunicipalityId(2L, 2L), "Valle", "Palmira"));
statmuns.stream().forEach(System.out::println);
Example unsorted List
codeState=1, codeMunicipality=1, nameState=Atlántico, nameMunicipality=Barranquilla
codeState=3, codeMunicipality=3, nameState=Antioquia, nameMunicipality=Envigado
codeState=2, codeMunicipality=3, nameState=Valle, nameMunicipality=Yumbo
codeState=3, codeMunicipality=2, nameState=Antioquia, nameMunicipality=ItagüÃ
codeState=2, codeMunicipality=1, nameState=Valle, nameMunicipality=Cali
codeState=3, codeMunicipality=1, nameState=Antioquia, nameMunicipality=MedellÃn
codeState=1, codeMunicipality=2, nameState=Atlántico, nameMunicipality=Soledad
codeState=1, codeMunicipality=3, nameState=Atlántico, nameMunicipality=Puerto Colombia
codeState=2, codeMunicipality=2, nameState=Valle, nameMunicipality=Palmira
我想得到
(在嵌套排序的映射中)根据此顺序,首先按
nameState
nameMunicipality
.
codeState=3, codeMunicipality=3, nameState=Antioquia, nameMunicipality=Envigado
codeState=3, codeMunicipality=2, nameState=Antioquia, nameMunicipality=ItagüÃ
codeState=3, codeMunicipality=1, nameState=Antioquia, nameMunicipality=MedellÃn
codeState=1, codeMunicipality=1, nameState=Atlántico, nameMunicipality=Barranquilla
codeState=1, codeMunicipality=3, nameState=Atlántico, nameMunicipality=Puerto Colombia
codeState=1, codeMunicipality=2, nameState=Atlántico, nameMunicipality=Soledad
codeState=2, codeMunicipality=1, nameState=Valle, nameMunicipality=Cali
codeState=2, codeMunicipality=2, nameState=Valle, nameMunicipality=Palmira
codeState=2, codeMunicipality=3, nameState=Valle, nameMunicipality=Yumbo
编辑
Map<Long, Map<Long, StateMunicipality>> sortedMapOfMaps = statmuns
.stream().sorted(
Comparator.comparing(StateMunicipality::getNameState).thenComparing(
Comparator.comparing(StateMunicipality::getNameMunicipality))
).collect(Collectors.groupingBy(
statmuni -> statmuni.getId().getCodeState(),
Collectors.toMap(
statmuni -> statmuni.getId().getCodeMunicipality(),
Function.identity(),
(e1, e2) -> e1, LinkedHashMap::new)
));
System.out.println("sortedMapOfMaps");
sortedMapOfMaps.entrySet().stream().forEach(
set -> {
//System.out.println(set.getKey() + " = " + set.getValue());
set.getValue().forEach((key, val) -> {
System.out.println(key + " = " + val.toString());
});
}
);
我很接近!
sortedMapOfMaps
1 = codeState=1, codeMunicipality=1, nameState=Atlántico, nameMunicipality=Barranquilla
3 = codeState=1, codeMunicipality=3, nameState=Atlántico, nameMunicipality=Puerto Colombia
2 = codeState=1, codeMunicipality=2, nameState=Atlántico, nameMunicipality=Soledad
1 = codeState=2, codeMunicipality=1, nameState=Valle, nameMunicipality=Cali
2 = codeState=2, codeMunicipality=2, nameState=Valle, nameMunicipality=Palmira
3 = codeState=2, codeMunicipality=3, nameState=Valle, nameMunicipality=Yumbo
3 = codeState=3, codeMunicipality=3, nameState=Antioquia, nameMunicipality=Envigado
2 = codeState=3, codeMunicipality=2, nameState=Antioquia, nameMunicipality=ItagüÃ
1 = codeState=3, codeMunicipality=1, nameState=Antioquia, nameMunicipality=MedellÃn
System.out.println("sortedMapState");
Map<Long, StateMunicipality> sortedMapState = statmuns.stream().sorted(
Comparator.comparing(StateMunicipality::getNameState)
).collect(
Collectors.toMap(stateMunicipality -> stateMunicipality.getId().getCodeState(),
Function.identity(),
(e1, e2) -> e1, LinkedHashMap::new)
);
sortedMapState.forEach((key, val) -> {
System.out.println(key + " = " + val.getNameState());
});
我有一张订好的地图
states
sortedMapState
3 = Antioquia
1 = Atlántico
2 = Valle