java - 按 "add() count"排序的集合

标签 java

我正在尝试实现一个按添加数量排序的 Set,如下所示:

public class App {
    public static void main(String args[]) {
        FrequencyOrderedTreeSet<String> set = new FrequencyOrderedTreeSet<String>();
        set.add("bar");
        set.add("foo");
        set.add("foo");
        Iterator<String> i = set.iterator();
        while (i.hasNext()) {
            System.out.print(i.next());
        }
        // prints "foobar"
    }
}

我创建了一个 protected class FrequencyOrderedTreeSet.Element它实现了 Comparable并有一个T entry和一个int frequency属性(property)和延伸TreeSet<FrequencyOrderedTreeSet.Element>FrequencyOrderedTreeSet<T>并覆盖 compareToequals Element 上的方法.

一个问题是,由于类型删除问题,我无法重写 add() 方法,而且我也无法调用 instanceof Elementequals方法,因为如果给它的对象是一个 Element,我必须比较它们的条目,但如果不是,我必须将对象本身与 this.entry 进行比较.

add方法我创建一个新元素,找到集合中具有相同条目的元素,将新元素的频率设置为“旧+1”,删除旧元素并添加新元素。我什至不确定这是最好的方法,或者它是否有效,因为我描述了其他问题。

问题是:实现这种数据结构的最佳方法是什么?如果我在某种程度上走在正确的轨道上 - 我怎样才能避免上面提到的问题?

最佳答案

这是一个基本的实现。这不是最优的,如果您想实现完整的 Set 接口(interface),还需要做更多的工作。

public class FrequencySet<T> implements Iterable<T>
{
    private TreeSet<T> set;
    private HashMap<T, Integer> elements = new HashMap<T, Integer>();

    public FrequencySet()
    {
        set = new TreeSet<T>(new Comparator<T>()
        {
            public int compare(T o1, T o2)
            {
                return elements.get(o2)-elements.get(o1);
            }
        });
    }

    public void add(T t)
    {
        Integer i = elements.get(t);
        elements.put(t, i == null ? 1 : i+1);
        set.remove(t);
        set.add(t);
    }

    public Iterator<T> iterator() {return set.iterator();}

    public static void main(String [] args)
    {
        FrequencySet<String> fset = new FrequencySet<String>();

        fset.add("foo");
        fset.add("bar");
        fset.add("foo");
        for (String s : fset)
            System.out.print(s);
        System.out.println();

        fset.add("bar");
        fset.add("bar");
        for (String s : fset)
            System.out.print(s);
    }
}

关键在add方法。我们更改给定对象的计数器(这会更改关系顺序),将其从支持集中删除并将其放回。

关于java - 按 "add() count"排序的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23542673/

相关文章:

java - 关于对 ArrayList 元素的引用的简单 Java 问题

java - 如何在动态下拉列表中选择一个元素?

java - 如何使用 Jackson 将一段 xml 包装在 CDATA 标记中

java - 如何通过蓝牙在其他设备上显示相机预览?

java - 使用 JPA 时,数据库中会添加 2 个条目,而不是仅 1 个

java - 为什么 Spring Security 的 BCrypt 实现使用 no-early-return equals 方法?

java - 单个对象在 JVM 堆空间中的位置

java - "\1"在这个 Java 字符串中代表什么?

java - 在 Java 中分解数字 - 家庭作业

java - 为什么我的 java 代码不向 firebase 发送数据?