【问题标题】:Sort ArrayList of ArrayList of objects对对象的 ArrayList 的 ArrayList 进行排序
【发布时间】:2017-04-21 15:20:24
【问题描述】:

我在使用比较器对对象的 ArrayList 的 ArrayList 进行排序时遇到问题,我有这个简单的代码:

        ArrayList<ArrayList<Object>> office = new ArrayList<ArrayList<Object>>(15);
        ArrayList<Object> objectArrayList1 = new ArrayList<Object>(15);
        objectArrayList1.add("Denver");
        objectArrayList1.add(108);
        office.add(objectArrayList1);

        ArrayList<Object> objectArrayList2 = new ArrayList<Object>(15);
        objectArrayList2.add("NewYork");
        objectArrayList2.add(109);
        office.add(objectArrayList2);

       [[Denver, 118], [NewYork, 109]]

如何按数字或字符串排序?

【问题讨论】:

  • "我在使用 Comparator 时遇到问题" 你能给我们看看这段代码吗?您发布的内容没有显示任何内容。
  • 您的第一个错误是ArrayList&lt;ArrayList&lt;Object&gt;&gt;。我想不出我曾经需要过的任何一种情况。丹佛和 118 可能以某种方式相互关联。这种关系应该封装在一个类中。然后你可以有一个ArrayList&lt;City&gt;,或者其他的。

标签: java arraylist comparator


【解决方案1】:

您将不得不使用 Collections.sort() 覆盖 compare() 方法并创建一个新的比较器。因为您使用的是对象,所以很难编写通用排序器。这是对自定义对象的 arrayList 进行排序的示例

 Collections.sort(finalList, new Comparator<FinalAccount>()
        @Override
        public int compare(FinalAccount o1, FinalAccount o2) {
            Double o1Double = o1.reductionAmount;
            Double o2Double = o2.reductionAmount;
            return o1Double.compareTo(o2Double);
        }

    });

但这同样只适用于一种类型的对象,泛型会混淆事物,因为您可能拥有任何类型的对象。

【讨论】:

  • 泛型不会混淆事物。相反,inheritance 会混淆事物(通过使用Object)。
  • 我认为在这种情况下两者都可以。如果您有一个大小为 50 的数组列表,并且其中包含 50 个不同的对象,那么编写通用比较器将是不可靠的,除非您实现了一种非常基本的排序方式
  • 这是一个问题,因为一切都隐含地是多态的并且派生自ObjectList&lt;Anything&gt; 不应该是精心设计的语言,你应该是具体的。
  • 如果我将它设为字符串的 ArrayList 会有帮助吗?
  • 非常好,这将允许您按字母顺序排序,只需使用与我完全相同的语法,但不是 finalList 使用您的字符串列表,而不是 FinalAccount 使用字符串,如果这有效并且您觉得对答案感到满意,请考虑接受:)
【解决方案2】:

您的数据模型有点偏离。 假设您要存储城市的数据及其关联的“分数”以进行排序,您需要一个可以包含城市及其分数的对象列表。该实体必须具有可比性。

例如

Team implements Comparable {
 String city;
 int score;
 Team(String city, int score) {
  this.city = city;
  this.score = score; 
 }

@Override
 public int compareTo(Team other) {
   return this.score - other.score;
 } 
}

现在您可以对团队的 ArrayList 进行排序

List<Team> teams = Arrays.asList(new Team("New York", 101), new Team("Denver", 108));
Collections.sort(teams); // sorts in-place

您还可以使用自定义比较器,例如

Collections.sort(teams, new Comparator<Team>(){
@Override
public int compare(Team t1, Team t2) {
 return t1.city.compareTo(t2.city);
}
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2015-12-17
    • 2014-11-09
    • 1970-01-01
    • 2013-01-06
    • 2015-12-27
    相关资源
    最近更新 更多