【问题标题】:How to sort List of List in 3 Categories [closed]如何对 3 类列表中的列表进行排序 [关闭]
【发布时间】:2020-06-19 08:10:57
【问题描述】:

我想根据许多列对列表进行排序,但我不知道如何进行。

输入

List<String> a = ["TEAMA", "COUNTRYA", "AGEA", "PLAYERA"]
List<String> b = ["TEAMB", "COUNTRYF", "AGEA", "PLAYERB"]
List<String> c = ["TEAMC", "COUNTRYR", "AGEB", "PLAYERC"]
List<String> d = ["TEAMB", "COUNTRYF", "AGEC", "PLAYERD"]
List<String> e = ["TEAMA", "COUNTRYA", "AGEA", "PLAYERE"]
List<String> f = ["TEAMA", "COUNTRYF", "AGEE", "PLAYERF"]
List<List<String>> FinalList = []
FinalList.add(a)
FinalList.add(b)
FinalList.add(c)
FinalList.add(d)
FinalList.add(e)
FinalList.add(f)

输出:

["TEAMA", "COUNTRYA", "AGEA", "PLAYERA"]
["TEAMA", "COUNTRYA", "AGEA", "PLAYERE"]
["TEAMA", "COUNTRYF", "AGEE", "PLAYERF"]
["TEAMB", "COUNTRYF", "AGEA", PLAYERB"]
["TEAMB", "COUNTRYF", "AGEC", "PLAYERD"]
["TEAMC", "COUNTRYR", "AGEB", "PLAYERC"]

我该如何处理它?

【问题讨论】:

  • 你尝试了什么,你卡在哪里了?

标签: java arrays sorting


【解决方案1】:

我已经在您之前的一篇文章中提供了答案。我们没有一个字符串列表,而是将其表示为一个普通的旧 java 对象,称为 Entity(给它一个更好的名称)。然后我们从所有 Entity 对象创建一个 List,并根据团队进行排序。如果您想按国家或球员进行排序,您可以轻松做到。

  1. 创建一个 POJO 来表示这些字符串值。
   private static final class Entity {

        private final String team;

        private final String country;

        private final String age;

        private final String player;

        private Entity(String team, String country, String age, String player) {
            this.team = team;
            this.country = country;
            this.age = age;
            this.player = player;
        }

        public String getTeam() {
            return team;
        }

        public String getCountry() {
            return country;
        }

        public String getAge() {
            return age;
        }

        public String getPlayer() {
            return player;
        }
    }

创建一些 Comparator 对象以重复使用,以便您可以按不同的属性进行排序。

    private static final Comparator<Entity> SORT_BY_TEAM = Comparator.comparing(Entity::getTeam);

    private static final Comparator<Entity> SORT_BY_COUNTRY = Comparator.comparing(Entity::getCountry);

    private static final Comparator<Entity> SORT_BY_AGE = Comparator.comparing(Entity::getAge);

    private static final Comparator<Entity> SORT_BY_PLAYER = Comparator.comparing(Entity::getPlayer);
    public static void main(String[] args) {
        List<Entity> entities = new ArrayList<>(Arrays.asList(
                new Entity("TEAMA", "COUNTRYA", "AGEA", "PLAYERA"),
                new Entity("TEAMA", "COUNTRYA", "AGEA", "PLAYERE"),
                new Entity("TEAMA", "COUNTRYF", "AGEE", "PLAYERF"),
                new Entity("TEAMB", "COUNTRYF", "AGEA", "PLAYERB"),
                new Entity("TEAMB", "COUNTRYF", "AGEC", "PLAYERD"),
                new Entity("TEAMC", "COUNTRYR", "AGEB", "PLAYERC")));

        List<Entity> sortedByTeam = entities.stream().sorted(SORT_BY_TEAM).collect(Collectors.toList());

        List<Entity> sortedByAge = entities.stream().sorted(SORT_BY_AGE).collect(Collectors.toList());

        List<Entity> sortedByCountry = entities.stream().sorted(SORT_BY_COUNTRY).collect(Collectors.toList());

        List<Entity> sortedByPlayer = entities.stream().sorted(SORT_BY_PLAYER).collect(Collectors.toList());
    }

【讨论】:

    【解决方案2】:

    您可以创建与列一样多的比较器,并一次使用一个或链接它们以按多个排序标准进行排序:

    Comparator<List<String>> byIndex0 = Comparator.comparing(i -> i.get(0));
    Comparator<List<String>> byIndex1 = Comparator.comparing(i -> i.get(1));
    Comparator<List<String>> byIndex2 = Comparator.comparing(i -> i.get(2));
    Comparator<List<String>> byIndex3 = Comparator.comparing(i -> i.get(3));
    

    按期望的标准对最终列表进行排序,例如。按第一个索引(团队)

    FinalList.sort( byIndex0 );
    

    要按两个标准排序,您可以使用#thenComparing 将它们链接起来,例如。按团队然后按国家/地区

    FinalList.sort( byIndex0.thenComparing(byIndex1));
    

    或全部使用:

    FinalList.sort( byIndex0.thenComparing(byIndex1).thenComparing(byIndex2).thenComparing(byIndex3));
    

    【讨论】:

      【解决方案3】:
      public class SortListExample {
          public static void main(String[] args) {
              List<String> a = Arrays.asList("TEAMA", "COUNTRYA", "PLAYERA");
              List<String> b = Arrays.asList("TEAMB", "COUNTRYF", "PLAYERB");
              List<String> c = Arrays.asList("TEAMC", "COUNTRYR", "PLAYERC");
              List<String> d = Arrays.asList("TEAMB", "COUNTRYA", "PLAYERD");
              List<String> e = Arrays.asList("TEAMA", "COUNTRYA", "PLAYERE");
              List<String> f = Arrays.asList("TEAMA", "COUNTRYF", "PLAYERF");
              List<List<String>> FinalList = new ArrayList<>();
              FinalList.add(a);
              FinalList.add(b);
              FinalList.add(c);
              FinalList.add(d);
              FinalList.add(e);
              FinalList.add(f);
              List<List<String>> listToSort = new ArrayList<>(FinalList);
              listToSort.sort((l1, l2) -> {
                  int i = 0;
                  while (true) {
                      if (l1.get(i) != null && l2.get(i) != null) {
                          int compareVal = l1.get(i).compareTo(l2.get(i));
                          if (compareVal != 0) {
                              return compareVal;
                          }
                          i++;
                      }
                  }
              });
              for (List<String> list: listToSort) {
              System.out.println(list);
          }
          }
      }
      

      【讨论】:

        【解决方案4】:

        您只需检索链接列表的值,然后存储和排序从同一列(或索引)检索的值。还要确保在代码中包含所有引号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-02
          • 1970-01-01
          相关资源
          最近更新 更多