代码之家  ›  专栏  ›  技术社区  ›  QA_Col

Java 8,使用两个字段获取地图的排序图

  •  0
  • QA_Col  · 技术社区  · 6 年前

    我想从一个未排序的列表中获得一个使用两个字段(州和市)的排序地图。

    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
    

    0 回复  |  直到 6 年前