从ArrayList中删除重复的对象

时间:2015-03-21 12:39:35

标签: java object arraylist

我创建了一个模拟餐馆账单的程序,它包含两个类,Diner和Food Item。

项目类:

package dinersbill;

public class Item {

    private String name;
    private double price;
    private int buyerCount = 0;

    public Item(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public int getBuyerCount() {
        return buyerCount;
    }

    public void incrementBuyerCount() {
        buyerCount += 1;
    }

}

晚餐课程:

package dinersbill;

import java.util.ArrayList;

public class Diner {

    private String name;
    private ArrayList<Item> itemList = new ArrayList<Item>();

    public Diner(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public ArrayList<Item> getItemList() {
        return itemList;
    }

    public void addItem(Item foodItem) {
        itemList.add(foodItem);
        foodItem.incrementBuyerCount();
    }

    public double getPrice() {
        double total = 0;
        for(Item item : itemList) {
            total += item.getPrice() / item.getBuyerCount();
        }
        return total;
    }

}

Diner类包含Item对象的ArrayList,因为一个Diner可以购买多个Items。最后,我有顶级类,它包含Diner对象的ArrayList:

package dinersbill;

import java.util.ArrayList;

public class DinerList {

    private ArrayList<Diner> diners = new ArrayList<Diner>();

    public DinerList(ArrayList<Diner> diners) {
        this.diners = diners;
    }

    public ArrayList<Item> getDinerItems() {
        ArrayList<Item> itemList = new ArrayList<>();
        for(Diner d : diners) {
            for(Item i : d.getItemList()) itemList.add(i);
        }
        return itemList;
    }

} 

我如何改变DinerList中的getDinerItems方法,只返回一次出现的对象?我对此列表中出现多次的项目存在问题,因为单个项目可能由多个用餐者购买。

例如:

private static DinerList diners = new DinerList(dinerList);

public static void main(String[] args) {
    Diner diner1 = new Diner("John");
    Diner diner2 = new Diner("Tom");

    dinerList.add(diner1);
    dinerList.add(diner2);

    Item item1 = new Item("Pizza", 5);
    Item item2 = new Item("Icecream", 10);

    diner1.addItem(item1);
    diner2.addItem(item1);
    diner2.addItem(item2);

    for(Item i : diners.getDinerItems()) {
        System.out.println(i.getName());
    }


}

实际输出:

披萨 冰淇淋 比萨饼

我想要的输出:

披萨 冰淇淋

5 个答案:

答案 0 :(得分:2)

使用SetHashSet Implementation)代替设计用于避免重复元素的arraylist

答案 1 :(得分:2)

最简单的方法是将删除重复的功能委派给Set集合。

这需要正确实现equals()hashCode()方法,并使Item不可变类。

答案 2 :(得分:1)

我对您的问题的理解是,您希望为每个用餐者存储一个项目列表,并存储另一个包含用餐者的列表。并且您想要删除重复的条目。实质上,您需要使用Set而不是ArrayList。 Set会自动禁止您在插入时存储重复项,因此不需要删除重复项。您可以使用HashSet或TreeSet。希望这可以帮助。 问候 和Sandeep

答案 3 :(得分:1)

根据您的示例应用程序,您似乎只想从getDinerItems()返回不同的项目名称。如果是这样,只需将方法更改为

public Set<String> getDinerItems() {
  Set<String> itemNames = new HashSet<String>();
  for (Diner d : diners) {
    for (Item i : d.getItemList()) {
      itemNames.add(i.getName());
    }
  }
  return itemNames;
}

但是,如果买方对你很重要(他们可能会这样做),你的Diner课程也需要进行更改:

您需要重新设计Diner类,以便它只能容纳一个具有给定名称的Item(假设&#34; name&#34;唯一标识项目和所有项目相同的名称在您的域模型中具有相同的价格)。这需要将Diner中的项目集合更改为Map

private Map<String, Item> items = new HashMap<String, Item>();

您还需要将addItem()中的逻辑修改为以下内容:

public void addItem(Item foodItem) {

    if (!items.contains(foodItem.getName())) {
      items.put(foodItem.getName(), foodItem);          
    }
    items.get(foodItem.getName()).incrementBuyerCount();
}

最后,在getDinerItems()中,您将总结所有用餐者的买家数量&#39;将项目转换为一组Item个返回的内容。

答案 4 :(得分:0)

你做得最短

itemList = new ArrayList<Item>(new HashSet<Item>(itemList));

在返回之前添加上述语句。

最好的选择是使用Set