カスタムのデータをTreeSet
. カスタム数が同じ場合は、出来高を足します。
これがInteratorTradeNode
を実装する私のクラスです。Comparable
import java.util.Comparator;
public class TradeNode implements Comparable<TradeNode> {
private String cstm; // custom number
private Integer mon = 0; // Trade
public TradeNode() {}
public TradeNode(String cstm, int mon) {
this.mon = mon;
this.cstm = cstm;
}
public int compareTo(TradeNode o) {
if (o.cstm.equals(this.cstm)) {
o.mon += this.mon;
return 0;
} else if (this.mon == o.mon) {
return this.cstm.compareTo(o.cstm);
} else {
//return (o.mon - this.mon);
return o.mon.compareTo(this.mon);
}
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof TradeNode)) {
return false;
}
TradeNode other = (TradeNode) obj;
if (cstm == null) {
if (other.cstm != null) {
return false;
}
} else if (!cstm.equals(other.cstm)) {
return false;
}
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cstm == null) ? 0 : cstm.hashCode());
return result;
}
@Override
public String toString() {
return "[" + cstm + "] [" + mon + "]";
}
public int getMon() {
return mon;
}
public void setMon(Integer mon) {
this.mon = mon;
}
public String getCstm() {
return cstm;
}
}
テストクラスは次のとおりです。
public class Testtree {
public static void main(String[] args) {
TradeNode nd1 = new TradeNode("A", 100);
TradeNode nd2 = new TradeNode("B", 10);
TradeNode nd3 = new TradeNode("B", 1000);
TreeSet<TradeNode> tree = new TreeSet<TradeNode>();
tree.add(nd1);
tree.add(nd2);
tree.add(nd3);
for (TradeNode node : tree) {
System.out.println(node);
}
}
出力は次のようになるはずです:
[B] [1010]
[A] [100]
しかし、出力は
[B] [1000]
[A] [100]
[B] [10]
誰かが私を助けて、私の過ちを指摘してくれませんか?
このように compareTo() メソッドを変更しても、まだ機能しません。
public int compareTo(TradeNode o) {
if (o.cstm.equals(this.cstm)) {
return 0;
} else {
return o.mon.compareTo(this.mon);
}
}
結果は次のとおりです。
[B] [1000]
[A] [100]
[B] [10]
Ben Xuのメソッドを試してみました。コードは次のとおりです: 私の新しい compareTo() メソッド:
public int compareTo(TradeNode o) {
if (o.cstm.equals(this.cstm)) {
return 0;
} else {
return this.mon.compareTo(o.mon);
}
}
私の新しい Testtree クラス:
public class Testtree {
public static void main(String[] args) {
TradeNode nd1 = new TradeNode("44010358010481", 150354);
TradeNode nd2 = new TradeNode("44010358010481", 150641);
TradeNode nd3 = new TradeNode("44010358010481", 270000);
TradeNode nd4 = new TradeNode("44010039275685", 10000);
TradeNode nd5 = new TradeNode("44010039275685", 980000);
TradeNode nd6 = new TradeNode("44010039275685", 5000);
TradeNode nd7 = new TradeNode("44010234235687", 10000);
TradeNode nd8 = new TradeNode("44010234235687", 360000);
TradeNode nd9 = new TradeNode("44010234235687", 53400);
Map<String, Integer> map = new HashMap<String, Integer>();
addTradeNode(map, nd1);
addTradeNode(map, nd2);
addTradeNode(map, nd3);
addTradeNode(map, nd4);
addTradeNode(map, nd5);
addTradeNode(map, nd6);
addTradeNode(map, nd7);
addTradeNode(map, nd8);
addTradeNode(map, nd9);
Iterator<Entry<String, Integer>> iterator = map.entrySet().iterator();
TradeNode t;
List<TradeNode> list = new ArrayList<TradeNode>();
while(iterator.hasNext()) {
Map.Entry<String, Integer> m = iterator.next();
t = new TradeNode(m.getKey(),m.getValue());
list.add(t);
}
Collections.sort(list);
for(TradeNode tn : list) {
System.out.println(tn);
}
}
private static void addTradeNode(Map<String, Integer> map, TradeNode node) {
Integer integer = map.get(node.getCstm());
if (integer == null) {
map.put(node.getCstm(), node.getMon());
} else {
map.remove(node.getCstm());
map.put(node.getCstm(), integer.intValue() + node.getMon());
}
}
}
結果は次のとおりです。
[44010234235687] [423400]
[44010358010481] [570995]
[44010039275685] [995000]
最後に、それは私の要件を満たしました。しかし、この新しい compareTo() メソッドが次のテスト メソッドで機能しない理由はまだわかりません。
public class Testtree2 {
public static void main(String[] args) {
TradeNode nd1 = new TradeNode("A", 100);
TradeNode nd2 = new TradeNode("B", 10);
TradeNode nd3 = new TradeNode("B", 1000);
TreeSet<TradeNode> tree = new TreeSet<TradeNode>();
tree.add(nd1);
tree.add(nd2);
tree.add(nd3);
for (TradeNode node : tree) {
System.out.println(node);
}
}
}
結果は次のとおりです。
[B] [10]
[A] [100]
[B] [1000]
そして、私はそれが次のようになると思いました:
[B] [10]
[A] [100]
新しいcompareTo()メソッドのどこに問題があるのか誰か教えてもらえますか? どうもありがとう、そして私を助けてくれた人に感謝します。
ははは、JavaRanch から回答がありました。ヘンリーという人が答えを教えてくれました。ここで、TreeSet で contains() メソッドを使用すると、この Set 内のすべてを検索するのではなく、並べ替えられた値のみを検索すると思います。
新しい Testtree3 クラスは次のとおりです。
public class Testtree3 {
public static void main(String[] args) {
TradeNode nd1 = new TradeNode("A", 100);
TradeNode nd2 = new TradeNode("B", 200);
TradeNode nd3 = new TradeNode("B", 1000);
TreeSet<TradeNode> tree = new TreeSet<TradeNode>();
tree.add(nd1);
tree.add(nd2);
tree.add(nd3);
for (TradeNode node : tree) {
System.out.println(node);
}
}
}
結果は次のとおりです。
[A] [100]
[B] [200]
ハハ。次に、TreeSet の背後にあるコードを探しに行きます。