一个java列表,只显示一次项,但统计其出现次数?

一个java列表,只显示一次项,但统计其出现次数?,java,list,arraylist,Java,List,Arraylist,我想创建一个列表,存储相同类型的对象,例如: class Card { String title; int point; public Card(String t, int p) { title = t; point = p; } } Fred 2 Luke 1 John 1 我向列表中添加了一些对象: list.add(new Card("Fred",3)); list.add(new Card("Fred",1)); li

我想创建一个列表,存储相同类型的对象,例如:

class Card {
    String title;
    int point;

    public Card(String t, int p) {
        title = t;
        point = p;
    }
}
Fred 2
Luke 1
John 1
我向列表中添加了一些对象:

list.add(new Card("Fred",3));
list.add(new Card("Fred",1));
list.add(new Card("Luke",5));
list.add(new Card("John",3));
如何执行以下任务? 创建一个新列表,其中包含以前的元素,但每个标题只包含一次,并统计它们的出现次数。例如:

class Card {
    String title;
    int point;

    public Card(String t, int p) {
        title = t;
        point = p;
    }
}
Fred 2
Luke 1
John 1
我可以做第一部分,我只是做一个HashSet,覆盖歌曲的'equals'和'hashCode'方法。但我不想完全删除两个同名的;
Map<String, Card> cardsByTitle = new TreeMap<>();

void add(String title, int point) {
    Card card = cardsByTitle.get(title);
    if (card == null) {
        card = new Card(title, point);
        cardsByTitle.put(title, point);
    } else {
        card.point += point;
    }
}

for (Card card : cardsByTitle.values) { }
无效添加(字符串标题,整数点){ Card Card=cardsByTitle.get(标题); 如果(卡==null){ 卡片=新卡片(标题、分数); cardsByTitle.put(标题、点); }否则{ 卡点+=点; } } 对于(卡片:cardsByTitle.values){}
或者类似的东西。TreeMap(i.o.HashMap)保持标题的有序性。

您可以实现自己的列表,该列表在内部将其元素存储在ArrayList中,并保持具有给定标题的卡片数量的映射:

public static class CountingList extends AbstractList<Card>{

    private final List<Card> list;
    private final Map<String, Integer> counterMap;

    public CountingList() {
        this(10);
    }

    public CountingList(Collection<? extends Card> c) {
        this(c.size());
        addAll(c);
    }

    public CountingList(int initialCapacity) {
        super();
        this.list = new ArrayList<>(initialCapacity);
        this.counterMap = new HashMap<>(initialCapacity);
    }


    @Override
    public boolean add(Card e) {
        Integer count = counterMap.get(e.title);
        String key = e.title;
        if (count == null) {
            list.add(e);
            count = 0;
        }
        counterMap.put(key, ++count);
        return count == 1;
    }

    @Override
    public void add(int index, Card element) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Card remove(int index) {
         throw new UnsupportedOperationException();
    }

    @Override
    public Card get(int index) {
        return list.get(index);
    }

    @Override
    public int size() {
        return list.size();
    }

    public int getNumberOfCards(int index){
        return getNumberOfCards(list.get(index).title);
    }

    public int getNumberOfCards(String title){
        Integer count = counterMap.get(title);
        return count == null ? 0 : count;
    }

    @Override
    public String toString() {
        StringBuilder b = new StringBuilder();
        b.append('[');
        for (Card c : this) {
            b.append(c.title).append('(').append(getNumberOfCards(c.title)).append(')');
        }
        b.append(']');
        return b.toString();
    }
}
公共静态类CountingList扩展了AbstractList{
私人最终名单;
私人最终地图;
公共计数列表(){
这(10);
}

public CountingList(Collectioneasy,检查具有此名称的元素是否存在,只需添加到其中,否则添加一个新的元素。如果需要
列表
,则必须创建另一个类;为什么不使用
映射
数据相关吗?不,我只是太傻了,忘记了int类型。