【问题标题】:JAVA Iterator with condition带有条件的 JAVA 迭代器
【发布时间】:2016-05-01 18:47:02
【问题描述】:

我想使用接口迭代器以指定的顺序迭代列表。 在这种情况下,我想按 product.prize 降序迭代列表 (listofproducts)。

public class Invoice {

    private static int static_id;

    private int id;
    private String date;
    private List<Product> listofproduct = new ArrayList<Product>();
    private boolean open;
}


public class Product {

    private static int count = 0;

    private int code;
    private String name;
    private String description;
    private double price;
}

我有一个公开的方法来获取价格。 我该如何解决这个问题?

【问题讨论】:

  • 你必须编写一个比较器,用这个比较器对列表进行排序(这非常昂贵)并迭代排序的列表
  • 有没有机会在不排序列表的情况下做到这一点?
  • 这真的取决于你想要做什么。如果您想按特定顺序浏览列表,那么您很可能需要对其进行排序。
  • @MassimoLavermicocca 我认为如果不对列表进行排序,您将无法做到这一点。唯一的另一种可能性是保留一个已经排序的列表并在每次插入元素时保持排序(插入时成本更高)

标签: java interface iterator


【解决方案1】:

有两种方法可以实现。使用 Comparator 很容易使用,您应该创建接口 Comparator 的新实现,然后实现 compare 和 equals 方法。它真的很强大,因为您可以创建多个比较器来对不同的字段进行排序。

您也可以将您的产品设为 Comparable,然后实现 compareTo 方法。

你可以看到sample with camparator and comparable interfaces

【讨论】:

    【解决方案2】:

    你应该使用Comparable&lt;T&gt;接口来实现你的比较逻辑

     class Product implements Comparable<Product>{
    
        private static int count = 0;
    
        private int code;
        private String name;
        private String description;
        private Double price;
    
    
        @Override
        public int compareTo(Product p) {
            return price.compareTo(p.getPrice());
        }
    }
    

    现在对列表进行排序,您可以简单地使用:

    Collections.sort(listOfProduct);
    

    【讨论】:

    • 实现接口Comparable还有一个好处:不需要getter!您可以直接访问私有字段
    • @ParkerHalo 是的,当我们有多个比较逻辑来实现使用Comparator 可撤销的同一对象时,我们基本上使用Comparator :)跨度>
    【解决方案3】:

    如果数据量不是太大,您可以在不考虑性能的情况下执行以下操作:

    List<Product> sortList = new ArrayList<>(origList);
    Collections.sort(sortList, new Comparator<Product>() {
        @Override
        public int compare(Product arg0, Product arg1) {
            return (int)(arg1.getPrice() - arg0.getPrice());
        }
    });
    

    这将创建一个原始列表的副本,该列表将由比较器进行排序。之后,遍历sortList 将按price 排序(降序)

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多