【问题标题】:Sort the contents of an array from the values of an arraylist根据 arraylist 的值对数组的内容进行排序
【发布时间】:2015-01-12 21:44:38
【问题描述】:

我有一个数组和一个数组列表:

String[] league = {"Leeds United","Liverpool","Chelsea","Manchester City","Stoke City"...
List<Integer> points = new ArrayList<Integer>();
points.add(7);
poinst.add(0);
points.add(5);
points.add(0);
points.add(5);

在哪里:

利兹联 = 7

利物浦 = 0 等等……

我希望能够按数字降序对列表进行排序,但联赛数组应该反映这种排序。

这可能吗?我该怎么做。 谢谢

【问题讨论】:

  • 你能把代码改成使用类结构吗?有俱乐部名称和会员积分?

标签: java arrays eclipse arraylist


【解决方案1】:

在某处定义这个静态类:

private static final class Pair implements Comparable<Pair> {
    private final String name;
    private final int score;
    private Pair(String name, int score) {
        this.name = name;
        this.score = score;
    }

    @Override
    public int compareTo(Pair p2) {
        return Integer.compare(p2.score, score);
    }

    @Override
    public final String toString() {
        return "["+score+":"+name+"]";
    }
}

并从您的分数数据中填写一个配对列表并对其进行排序:

List<Pair> pairs = new ArrayList<>();
for(int i=0;i<league.length;++i)
    pairs.add(new Pair(league[i], points.get(i)));
Collections.sort(pairs);

System.out.println(pairs);

【讨论】:

    【解决方案2】:

    使用正确的存储格式来实现这一点

    首先你应该使用Map

    Maps 旨在存储从键到特定值的关系,在您的情况下是从 String 到 int (Map&lt;String, Integer&gt;)

    然后您可以像这个问题中描述的那样对Map 进行排序:

    Sort a Map<Key, Value> by values (Java)

    这应该是解决您的问题的最充分的方法。

    【讨论】:

    • 谁对此投了反对票,您能否说明您认为我的问题有什么问题?
    【解决方案3】:

    这使用Java的Comparator接口,并根据数组将点存储在地图中:

    final Map<String, Integer> pointMap = new HashMap<>();
    for(int i = 0; i < league.length; i++) {
        pointMap.put(league[i], points.get(i));
    }
    
    Collections.sort(league, new Comparator<String>() {
        public int compare(String a, String b) {
            return Integer.compare(pointMap.get(b), pointMap.get(a)); //descending order
        }
    });
    

    【讨论】:

    • 哦,对不起!我忘了从列表中获取相应的整数。请删除反对票或添加评论,说明反对票的原因以及如何改进答案。
    • 我将如何使用比较器?抱歉,我没有这方面的经验
    【解决方案4】:

    首先,您需要一个关联数据结构来保存球杆及其点。地图听起来是个不错的选择。

    // Key is club, value is its point
    final Map<String, Integer> points = ...
    

    然后您可以使用自定义比较器按降序排列您的联赛数组

    Arrays.sort(league, new Comparator<String>() {
      public int compare(String club1, String club2) {
        return -Integer.compare(points.get(club1), points.get(club2));
      }
    });
    

    【讨论】:

      【解决方案5】:

      这里是复杂度N Log N的独立Java(5+)解决方案:

          assert league.length == points.size() : "arrays must have the same size";
          //fill a map
          final Map<String,Integer> teamPoints = new HashMap<String,Integer>();
          for (int i = 0; i < league.length; i++) {
              teamPoints.put(league[i], points.get(i));
          }
          //sort
          Arrays.sort(league, new Comparator<String>() {
      
              @Override
              public int compare(String o1, String o2) {
                  //sort in descending order
                  return teamPoints.get(o2) - teamPoints.get(o1);
              }
      
          });
      

      【讨论】:

        【解决方案6】:

        解决此问题的更好方法是创建实现Comparable 的数据的对象抽象,创建这些实例,并使用Collections.sort 在列表中对它们进行排序。

            public class FootballClub implements Comparable<FootballClub> {
                private final int rank;
                private String name;
        
                public FootballClub(final int rank, final String name) {
                    this.rank = rank;
                    this.name = name;
                }
        
                public int getRank() {
                    return rank;
                }
        
                public String getName() {
                    return name;
                }
        
                public int compareTo(final FootballClub other) {
                    return rank - other.getRank();
                }
            }
        

        在这里使用数组和ArrayList 是没有意义的。使用对您最有利的数据结构。

        【讨论】:

        • footballClubs.put(0, ""Leeds United"); footballClubs.put(0, "Liverpool"); - 将更新现有项目。不能解决问题。
        • 其他答案已经涵盖了,所以我会稍微改变一下。
        猜你喜欢
        • 1970-01-01
        • 2017-12-02
        • 2012-11-20
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 2013-06-07
        相关资源
        最近更新 更多