泛型频率表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
相关产品推荐
相关产品推荐

