要素を並べ替えるCollection
が必要ですが、重複は削除されません。
TreeSet
は実際に裏付けのあるTreeSet
に値を追加するので、私はTreeMap
を選びました。
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
そして、TreeMapはComparators
compare
ロジックを使用して重複を削除します
等しい要素の場合に0ではなく1を返すComparator
を作成しました。したがって、要素が等しい場合、TreeSet
とこのComparator
は重複を上書きせず、並べ替えるだけです。
単純なString
オブジェクトについてテストしましたが、カスタムオブジェクトのセットが必要です。
public static void main(String[] args)
{
List<String> strList = Arrays.asList( new String[]{"d","b","c","z","s","b","d","a"} );
Set<String> strSet = new TreeSet<String>(new StringComparator());
strSet.addAll(strList);
System.out.println(strSet);
}
class StringComparator implements Comparator<String>
{
@Override
public int compare(String s1, String s2)
{
if(s1.compareTo(s2) == 0){
return 1;
}
else{
return s1.compareTo(s2);
}
}
}
このアプローチは問題ありませんか、それともこれを達成するためのより良い方法がありますか?
[〜#〜]編集[〜#〜]
実際、私は次のクラスのArrayListを持っています。
class Fund
{
String fundCode;
BigDecimal fundValue;
.....
public boolean equals(Object obj) {
// uses fundCode for equality
}
}
fundCode
が最も高いすべてのfundValue
が必要です
最高のfundValueを持つすべてのfundCodeが必要です
それがソートしたい唯一の理由である場合は、まったくソートしないことをお勧めします。並べ替えには、主にO(n log(n))の複雑さが伴います。最大値を見つけることは、O(n)の複雑さしかなく、リストに対して単純な反復で実装されます。
List<Fund> maxFunds = new ArrayList<Fund>();
int max = 0;
for (Fund fund : funds) {
if (fund.getFundValue() > max) {
maxFunds.clear();
max = fund.getFundValue();
}
if (fund.getFundValue() == max) {
maxFunds.add(fund);
}
}
Guava のような第3レベルのライブラリを使用することで、このコードを回避できます。参照: グアバのリストからmax()要素を取得する方法
Collections.sort
を使用してリストを並べ替えることができます。
与えられたFund
:
List<Fund> sortMe = new ArrayList(...);
Collections.sort(sortMe, new Comparator<Fund>() {
@Override
public int compare(Fund left, Fund right) {
return left.fundValue.compareTo(right.fundValue);
}
});
// sortMe is now sorted
PriorityQueueを使用できます。
PriorityQueue<Integer> pQueue =
new PriorityQueue<Integer>();
PriorityQueue():デフォルトの初期容量(11)でPriorityQueueを作成し、自然順序に従って要素を並べ替えます。
TreeSetの代わりに、Listを使用して、Comparableインターフェイスを実装できます。
public class Fund implements Comparable<Fund> {
String fundCode;
int fundValue;
public Fund(String fundCode, int fundValue) {
super();
this.fundCode = fundCode;
this.fundValue = fundValue;
}
public String getFundCode() {
return fundCode;
}
public void setFundCode(String fundCode) {
this.fundCode = fundCode;
}
public int getFundValue() {
return fundValue;
}
public void setFundValue(int fundValue) {
this.fundValue = fundValue;
}
public int compareTo(Fund compareFund) {
int compare = ((Fund) compareFund).getFundValue();
return compare - this.fundValue;
}
public static void main(String args[]){
List<Fund> funds = new ArrayList<Fund>();
Fund fund1 = new Fund("a",100);
Fund fund2 = new Fund("b",20);
Fund fund3 = new Fund("c",70);
Fund fund4 = new Fund("a",100);
funds.add(fund1);
funds.add(fund2);
funds.add(fund3);
funds.add(fund4);
Collections.sort(funds);
for(Fund fund : funds){
System.out.println("Fund code: " + fund.getFundCode() + " Fund value : " + fund.getFundValue());
}
}
}
要素をarraylistに追加してから、ユーティリティCollections.sortを使用して要素を並べ替えます。次に、comparableを実装し、キーに応じて独自のcompareToメソッドを記述します。
重複も削除されません。並べ替えることもできます。
List<Integer> list = new ArrayList<>();
Collections.sort(list,new Comparator<Integer>()
{
@Override
public int compare(List left, List right) {
**your logic**
return '';
}
}
)
;
TreeSetの場合、ComparatorまたはComparableのいずれかを使用してオブジェクトを比較および保存します。イコールは呼び出されないため、重複するものは認識されません。