在使用比较器时苦苦挣扎

时间:2014-04-03 13:08:07

标签: java comparator

案例:我有一个对象的ArrayList,它有以下打印方法:

public void printAllItems()
{
    if(itemsList.isEmpty())
    {
        System.out.println("The list is empty");
    }
    else
    {
        System.out.println("Number of items: " + itemCount);
        for(ShopItem shopItem : itemsList) 
        {
            shopItem.printDetails();
            System.out.println();   // empty line between posts
        }
    }
}

现在我想按字母顺序对这些对象进行排序(itemName,当然还有合适的getItemName()方法)。我浏览了Java doc,发现我应该使用Comparator。问题是我实际上并没有理解如何将比较器代码实现到for循环中。有什么建议 ?

P.S。对不起,如果问题看起来非常简单,但我仍然是初学者,我很容易感到困惑:(

3 个答案:

答案 0 :(得分:2)

考虑getItemName()返回一个String,在循环之前添加:

Collections.sort(itemsList, new Comparator<ShopItem>(){
                     public int compare(ShopItem i1, ShopItem i2){
                         if(i1 == null || i2 == null)
                              return 0; //do properly nullable handling
                         return i1.getItemName().compareTo(i2.getItemName());
                     }
                  });

答案 1 :(得分:1)

打印集合之前,您可以执行以下操作:

Collections.sort(itemsList, new Comparator<ShopItem>() {
    public int compare(ShopItem i1, ShopItem i2) {
        return i1.getItemName().compareTo(i2.getItemName());
    }
});

我在这里使用Comparator界面的匿名实现

答案 2 :(得分:0)

您需要创建一个实现Comparator(或匿名类)的类。您可以在Comparator.compare文档中详细说明。

这是接受的答案中描述的方法。

我还想发布Java 8方法:

    itemsList
    .stream()
    .sorted(Comparator.comparing(ShopItem::getItemName))
    .forEach(item -> {
        item.printDetails();
        System.out.println();
    });