带条件的JAVA迭代器
我想使用接口迭代器按指定顺序迭代列表。 在本例中,我希望以product.prize降序迭代列表(listofproducts)带条件的JAVA迭代器,java,interface,iterator,Java,Interface,Iterator,我想使用接口迭代器按指定顺序迭代列表。 在本例中,我希望以product.prize降序迭代列表(listofproducts) public class Invoice { private static int static_id; private int id; private String date; private List<Product> listofproduct = new ArrayList<Product>();
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;
}
公共类发票{
私有静态int static_id;
私有int-id;
私有字符串日期;
private-List-listofproduct=new-ArrayList();
私有布尔开放;
}
公共类产品{
私有静态整数计数=0;
私有整数码;
私有字符串名称;
私有字符串描述;
私人双价;
}
我有一个公开的方法来获取价格。
如何解决这个问题?如果数据量不太大,您可以在不考虑性能的情况下执行以下操作:
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());
}
});
List-sortList=new-ArrayList(origList);
Collections.sort(sortList,newcomparator(){
@凌驾
公共整数比较(产品arg0、产品arg1){
返回(int)(arg1.getPrice()-arg0.getPrice());
}
});
这将创建原始列表的副本,该副本将由比较程序排序。之后,迭代
排序列表
将按价格
(降序)排序。您应该使用可比
界面来实现比较逻辑:
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());
}
}
实现这一目标有两种方法。使用Comparator很容易使用,您应该创建接口Comparator的新实现,然后实现compare和equals方法。它非常强大,因为您可以创建几个比较器来在不同的字段中进行排序 您还可以使您的产品具有可比性,然后实现compareTo方法
你可以看到你必须编写一个比较器,用这个比较器对列表进行排序(这是非常昂贵的),然后迭代排序后的列表。如果不对列表进行排序,就有机会这样做吗?这取决于你想做什么。如果您想按特定顺序浏览列表,那么您很可能需要对其进行排序。@MassimoLavermicocca我认为如果不对列表进行排序,您是无法做到这一点的。唯一的另一种可能性是保留已排序的列表,并在每次插入元素时保持排序(插入时成本更高),实现接口
Comparable
还有另一个优点:不需要getter!您只需直接访问专用数据库即可fields@ParkerHalo是的,当我们有多个Comparison逻辑来实现同一个对象时,我们基本上使用了比较器:)
Collections.sort(listOfProduct);