Я использовал для этого TreeSet, и он работает в стиле каждого снимка. Другими словами, sort Once отображается один раз.
Теперь я хочу реализовать отсортированную таблицу в реальном времени.
Всякий раз, когда происходит изменение значения каких-либо элементов, отсортированная таблица будет соответствующим образом обновляться.
Чтобы сортировка работала для каждого стиля обновления, я попытался удалить элемент и снова добавить его в TreeSet.
quotes.remove(quote);
quotes.add(quote);
Это не работает, потому что мне нужно реализовать логику сортировки в compareTo(), но это нарушает контракт для идентификации объекта, который заставляет работать remove(). TreeSet никогда не вызывает equals() и hashcode(), как описано в Java Doc.
Есть идеи? Пожалуйста, порекомендуйте.
код:
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, что в итоге содержит четыре элемента (ожидается 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 не хранит элементы по порядку. Порядок работает только при опросе элемента из очереди.
Обновление 3:
Попробовал предложение пользователя 54321, используя пользовательскую коллекцию (см. Ответ ниже). Однако это выглядит не очень хорошо, если есть еще два элемента с одинаковым значением «оборачиваемости».
Мое требование очень обычное. Кажется, ни одна коллекция из JDK не подходит для моего случая.
Обновление 4:
Решение от user54321 подходит для моей временной потребности. https://code.sololearn.com/c14Ybab7AOFm/#java
Quote
должен также переопределить методequals(Object)
, который он наследует от своего суперклассаjava.lang.Object
. И если вы переопределяете методequals(Object)
, рекомендуется также переопределить методhashCode()
. - person Abra   schedule 04.04.2020