如何通过使用Java TreeSet实现排序表(按元素的字段排序)?]

问题描述 投票:0回答:2

我为此使用了TreeSet,它以每个快照样式工作。换句话说,排序一次只显示一次。

现在,我想实现一个实时排序表。

每当元素中的值发生变化时,排序后的表就会相应地更新。

为了使排序按更新样式进行,我试图删除该元素并将其再次添加到TreeSet中。

quotes.remove(quote);
quotes.add(quote);

这是行不通的,因为我必须在compareTo()中实现排序逻辑,但是它破坏了使对象能够使remove()工作的约定。如Java文档所述,TreeSet永远不会调用equals()和hashcode()。

有什么想法吗?请指教。

代码:

import java.util.TreeSet;

public class TreeSetTest {

    public static void main(String args[]) {        
        TreeSetTest test = new TreeSetTest();
        test.onQuoteUpdate("appl", 1000d);
        test.onQuoteUpdate("msft", 2000d);
        test.onQuoteUpdate("face", 3000d);
        test.printTopStocks();
        test.onQuoteUpdate("msft", 5000d);
        test.printTopStocks();
    }

    private Set<Quote> quotes = new TreeSet<Quote>();

    public void onQuoteUpdate(String symbol, double turnover) {
        final Quote quote = new Quote(symbol, turnover);
        quotes.remove(quote);
        quotes.add(quote);
    }

    public void printTopStocks() {
        System.out.println("--Top Stocks By Turnover--");
        for (final Quote quote : quotes) {
            System.out.println(quote);
        }
    }
    public static class Quote implements Comparable<Quote> {

        private String symbol;

        private double turnover;

        public Quote(String symbol, double turnover) {
            this.symbol = symbol;
            this.turnover = turnover;
        }

        @Override
        public int compareTo(Quote o) {
            return Double.compare(o.turnover, turnover);
//          return symbol.compareTo(o.symbol);
        }

    }
}

更新1:

根据提议,我尝试过此操作:

public static void main(String args[]) {        
    TreeMapTest test = new TreeMapTest();
    test.onQuoteUpdate("appl", 1000d);
    test.onQuoteUpdate("msft", 2000d);
    test.onQuoteUpdate("face", 3000d);
    test.printTopStocks();
    test.onQuoteUpdate("face", 50d);
    test.printTopStocks();
}

    public int compareTo(Quote o) {
        if(o.symbol.equals(symbol)) return 0;
        return Double.compare(o.turnover, turnover);
    }

remove()返回false,最终Set中有四个元素(预期为3)。

--Top Stocks By Turnover--
Quote [symbol=face, turnover=3000.0]
Quote [symbol=msft, turnover=2000.0]
Quote [symbol=appl, turnover=1000.0]
remove symbol face : false
add    symbol face : true
--Top Stocks By Turnover--
Quote [symbol=face, turnover=3000.0]
Quote [symbol=msft, turnover=2000.0]
Quote [symbol=appl, turnover=1000.0]
Quote [symbol=face, turnover=50.0]

更新2:

我尝试了PriorityQueue,这是代码:https://code.sololearn.com/cb38Eo036c8y/#java

这不起作用,因为PriorityQueue不能按顺序存储元素。仅当您从队列中轮询元素时,该排序才有效。

我为此使用了TreeSet,它以每个快照样式工作。换句话说,排序一次只显示一次。现在,我想实现一个实时排序表。任何时候只要...

java sorting treeset
2个回答
0
投票

点数:


0
投票

删除了我之前添加的答案。看来该方案正在使用错误的数据结构。

这里是为什么。

© www.soinside.com 2019 - 2024. All rights reserved.