【问题标题】:Sorting ArrayList full of objects by their id using Collections.sort(arrayListName)使用 Collections.sort(arrayListName) 按 id 对充满对象的 ArrayList 进行排序
【发布时间】:2013-04-14 15:39:24
【问题描述】:

我有一个库存类,它创建一个充满对象 Item 的 ArrayList,它也是一个类。我知道我必须打电话 Collections.sort(items); 用于对 ArrayList 进行排序(顺便说一下,它被称为项目)。作业说我必须在 Item 类上使用一个接口,我不知道是否要实现 Comparator 或 Comparable ,然后分别为 compareTo() 方法或 compare() 方法写什么。另外,我在声明我的 ArrayList 后立即拨打了Collections.sort(items) 电话,可以吗?

编辑:我的老师刚刚澄清说她希望我们在 Item 类上实现 Comparable<Item>

【问题讨论】:

    标签: java sorting arraylist comparator comparable


    【解决方案1】:

    从 Java 8 开始:

    List<Item> items = new ArrayList<>();
    // add elements
    Collections.sort(items, Comparator.comparingLong(Item::getId));
    

    【讨论】:

      【解决方案2】:

      你必须实现Comparable,它会工作Collections.sort

      如果您需要一个新的比较器并且不想使用Comparable,您可以创建一个新的Comparator 并像这样使用它:Collections.sort(list, new MyComparator())

      public class Fruit implements Comparable<Fruit>{
          
          private String fruitName;
          private String fruitDesc;
          private int quantity;
          
          public Fruit(String fruitName, String fruitDesc, int quantity) {
              super();
              this.fruitName = fruitName;
              this.fruitDesc = fruitDesc;
              this.quantity = quantity;
          }
          
          public String getFruitName() {
              return fruitName;
          }
          public void setFruitName(String fruitName) {
              this.fruitName = fruitName;
          }
          public String getFruitDesc() {
              return fruitDesc;
          }
          public void setFruitDesc(String fruitDesc) {
              this.fruitDesc = fruitDesc;
          }
          public int getQuantity() {
              return quantity;
          }
          public void setQuantity(int quantity) {
              this.quantity = quantity;
          }
      
          public int compareTo(Fruit compareFruit) {
          
              int compareQuantity = ((Fruit) compareFruit).getQuantity(); 
              
              //ascending order
              return this.quantity - compareQuantity;
              
              //descending order
              //return compareQuantity - this.quantity;
              
          }   
      }
      

      来源:mkyong

      【讨论】:

      • 所以我有 Item 实现 Comparable 然后在类中我将 compareTo() 定义为 public int compareTo (Item other) { if (this.id.compareToIgnoreCase((other.getId ())) == 0) 返回 0;否则 if (this.id.compareToIgnoreCase(other.getId()) > 0) 返回 1;否则返回-1;现在我只是在我的 Inventory 类中调用 Collections.sort(items) 了吗?
      • 这就是我的想法,但是当我写 Collections.sort(items); 时它给了我一个错误。它说 - 令牌“项目”上的语法错误,此令牌后预期的 VariableDeclaratorId - 令牌上的语法错误,错位的构造
      • 等一下,我刚刚得到它,我正在把它放在类的正文中,谢谢!
      • 我讨厌带有链接的解决方案。它不是一个解决方案。你的一个链接是死的
      • @trixo 已更新。删除了坏链接,我从一个指定源的链接中添加了一个简短的实现:)
      【解决方案3】:

      Collections.sort() 有两个版本。

      Collections.sort(List)Collections.sort(List,Comparator) 。一个接受List,另一个接受ListComparator 的实例。单个参数sort() 将期望您的类实现Comparable 并覆盖compareTo() 方法。两个参数sort() 方法需要一个Comparator 的实例,其中您已经实现了Comparator 并覆盖了它的compare() 方法。

      一个对象应该实现Comparable,如果这是对类进行排序的清晰自然方式,并且任何需要对类进行排序的人通常都希望这样做。

      但是,如果排序是类的一个不寻常的用例,或者可能有多个排序顺序,那么Comparator 是一个更好的选择。

      另外,我在声明我的 ArrayList 后立即调用了 Collections.sort(items),这样可以吗?

      当您需要对List 进行排序时,您将调用sort()。在sort() 之后添加项目不会自动对List 进行排序,以适应由于添加新元素而导致的列表项排序变化。

      示例实现:

      public int compareTo (Item other) { 
         return new Integer(this.getID()).compareTo(new Integer(other.getID()));
      }
      

      【讨论】:

      • 我必须使用只调用 Collections.sort(items) 的那个
      • 好的,但是基于什么字段?
      • 什么意思,我不明白对不起
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2017-05-07
      • 2013-10-04
      • 2011-03-21
      • 2017-03-05
      • 2012-07-07
      相关资源
      最近更新 更多