You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

泛型频率表equals方法失效,元素频率无法累加问题求助

泛型频率统计类的相同元素频率累加问题

问题说明

我需要实现双向链表和ArrayList版本的频率统计功能:添加元素时,若列表中已有相同值的元素则累加其频率。最初用String类型实现时一切正常,改成泛型以支持String、int及自定义对象后出现问题——相同值元素的频率无法累加。

我已创建抽象类Card,用于生成随机的redCard和blackCard对象,这些对象能正常添加到列表,但频率累加逻辑失效,推测是泛型类型的equals方法未正确生效,尝试过多种equals实现均无效,怀疑是泛型实现存在问题。

相关代码

ArrayFrequencyTable.java

package aufgabe4b;

import java.util.Arrays;

/**
 *
 * @author Nico
 * @since 05.05.23
 */
public class ArrayFrequencyTable<T> extends AbstractFrequencyTable<T> {
    private int size = 0;
    private Element<T> fqTable[];
    private final int DEFAULT_SIZE = 100;

    public ArrayFrequencyTable() {
        clear();
    }

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

    @Override
    public final void clear() {
        fqTable = new Element[DEFAULT_SIZE];
        size = 0;
    }

    @Override
    public void add(T e, int f) {
        int i;
        for (i = 0; i < size; i++) {
            if (fqTable[i].getElement().equals(e)) {
                fqTable[i].addFrequency(f);
                moveToLeft(i);
                return;
            }
        }

        if (fqTable.length == size()) {
            fqTable = Arrays.copyOf(fqTable, 2 * size());
        }

        fqTable[size] = new Element<T>(e, f);
        size++;
        moveToLeft(size() - 1);
    }

    private void moveToLeft(int pos) {
                                        
        Element<T> e = fqTable[pos];
        int i = pos - 1;
        while (i >= 0 && e.getFrequency() > fqTable[i].getFrequency()) {
            fqTable[i + 1] = fqTable[i];
            i--;
        }
        fqTable[i + 1] = e;
    }

    /**
     * Liefert das Wort mit seiner Häufigkeit zurück, das mit seiner
     * Häufigkeit an Position pos steht.
     * get(0) liefert das häufigste Wort zurück,
     * get(1) liefert das zweithäufigste Wort zurück, usw.
     * 
     * @param pos Position.
     * @return Wort mit Häufigkeit oder null,
     *         falls die Tabelle weniger als pos-1 Elemente enthält.
     */
    @Override
    public Element<T> get(int pos) {
        return fqTable[pos];
    }

    /*
     * Liefert die Häufigkeit des Worts w zurück.
     * Falls das Wort nicht vorkommt, wird 0 zurückgeliefert.
     * 
     * @param w Wort
     * 
     * @return Häufigkeit.
     */
    @Override
    public int get(T e) {
        for (Element<T> currentE : fqTable) {
            if (currentE != null && currentE.getElement().equals(e)) {
                return currentE.getFrequency();
            }
        }
        return 0;
    }
}

Element.java

package aufgabe4b;

/**
 * Klasse für Wörter mit ihren Häufigkeiten.
 * @author Nico
 * @since 05.05.23
 */
public class Element<T> {
    final private T e;
    private int freqency;
    
    /**
     * Konstruktor.
     * @param e Element
     * @param f Häufgkeit
     */
    public Element(T e, int f) {
        this.e = e;
        this.freqency = f;
    }

    /**
     * Liefert Wort zurück.
     * @return Wort
     */
    public T getElement() {
        return e;
    }

    /**
     * Liefert Häufgkeit zurück.
     * @return Häufgkeit
     */
    public int getFrequency() {
        return freqency;
    }
    
    /**
     * Addiert zur Häufgkeit f dazu.
     * @param f Häufigkeitsänderung.
     */
    public void addFrequency(int f) {
        freqency += f;
    }

    /**
     * Liefert eine String-Darstellung zurück.
     * @return String-Darstellung.
     */
    @Override
    public String toString() {
        return e + ":" + freqency;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Element){
            return ((Element)obj).get().equals(this.get());
        }
        return false;
    }
}

内容的提问来源于stack exchange,提问作者IamNico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:18:07