我为此使用了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,它以每个快照样式工作。换句话说,排序一次只显示一次。现在,我想实现一个实时排序表。任何时候只要...
点数:
删除了我之前添加的答案。看来该方案正在使用错误的数据结构。
这里是为什么。