1

これは私がこれまでに持っているものです。インデックスの値に基づいて一連List<String>のをソートしようとしています。

LinkedHashSet<List<String>> sorted = new LinkedHashSet<List<String>>();

LinkedHashSet をリストのインデックス 2 の値が最も高いものから最も低いものに並べ替えるにはどうすればよいですか?

入力例:

List<String> data1 = Database.getData(uuid);
double price = Double.valueOf(data1.get(2))

data1.add("testval");
data1.add("testval");
data1.add("100.00");

sorted.add(data1);

そして別の別のリストで:

List<String> data2 = Database.getData(uuid);
double price = Double.valueOf(data2.get(2))

data2.add("anotherval");
data2.add("anotherval");
data2.add("50.00");

sorted.add(data2);

ソートされた LinkedHashSetの降順での出力。

testval testval 100.00
anotherval anotherval 50.00

これが混乱している場合は申し訳ありませんが、このような並べ替えについてどこに行くべきかわかりません。

4

3 に答える 3

3

まず、 Oracle の Java リファレンスから抜粋します。

このリンクされたリストは、要素がセットに挿入された順序である反復順序を定義します

したがって、データを に挿入するだけではデータを並べ替えることができませんLinkedHashSetset の実装とSortedSetを混同しているかもしれません。SortedSetデータ構造内の要素の順序を決定するコンパレータを渡すことができます。

一方、あなたがList<String>恣意的にあなたを選んだかどうかはわかりませんが、3 つの文字列をクラス属性として集約する方が賢明なオプションのように思えます。ポイントは、要素が常に 3 つの要素になり、最後の要素が double 値になる場合です。なぜ動的構造が として必要なのListですか?

編集

ここでは、必要なものをより適切に実装できます。

public class Element
{
    public Element(String a, String b, double val) {
        this.a = a;
        this.b = b;
        this.val = val;
    }

    @Override
    public String toString() {
        return a + "\t" + b + "\t" + val;
    }

    public String a;
    public String b;
    public double val;
}

そして、このクラスを使用して要素を保存できます。使用例:

 SortedSet<Element> sorted = new TreeSet<>(new Comparator<Element>() {
        @Override
        public int compare(Element o1, Element o2) {
            return (new Double(o1.val)).compareTo(o2.val);
        }
    });

sorted.add(new Element("testval", "testval", 100.0));
sorted.add(new Element("anotherval", "anotherval", 50.0));
for(Element el: sorted)
{
    System.out.println(el);
}

Comparatorコンパレーターは、Java のインターフェースを実装する匿名内部クラスのインスタンスとして与えられることに注意してください。

于 2014-12-08T13:33:20.293 に答える
3
  • まず、 aLinkedHashSetではなく aを使用する必要がありTreeSetます。LinkedHashSetソートせずに挿入順序を保持します。
  • 次に、必要な値に基づいて比較TreeSetする aで your を初期化する必要があります。つまり、値を表すのインデックスが事前にわかっている場合です。それ以外の場合は、代わりにカスタム オブジェクトを使用することをお勧めします。ComparatorListStringdoubleList

カスタム オブジェクトを使用することに決めた場合、必ずしもを 2 番目の引数として初期化TreeSetする必要はありません。Comparator

代わりに、カスタム オブジェクトComparableに を実装させ、そこで 1 回限りの比較ロジックを実装することができます。

それはすべて、特定の順序で並べ替えるだけでよいかどうかによって異なります。

最後に、カスタム オブジェクトでは と をオーバーライドする必要がありequalsますhashCode

于 2014-12-08T13:33:54.333 に答える
3

複雑なオブジェクトを表す新しいクラスを作成します。オブジェクトで実行できる場合、リストに複数の値を格納する必要はありません。

public class ComplexObject {
    private String description1;
    private String description2;
    private Double value;

    public ComplexObject(String description1, String description2, Double value) {
        this.description1 = description1;
        this.description2 = description2;
        this.value = value;
    }

    public void setDescription1(String description1) {
        this.description1 = description1;
    }

    public String getDescription1() {
        return description1;
    }

    public void setDescription2(String description2) {
        this.description2 = description2;
    }

    public String getDescription2() {
        return description2;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    public Double getValue() {
        return value;
    }
}

次に、要素をリストに追加し、新しいカスタム コンパレータを使用して並べ替えます。

public static void main(String[] args) {

    List<ComplexObject> complexObjectList = new ArrayList<ComplexObject>();

    //add elements to the list
    complexObjectList.add(new ComplexObject("testval","testval",100.00d));
    complexObjectList.add(new ComplexObject("anotherval","anotherval",50.00d));

    //sort the list in descending order based on the value attribute of complexObject
    Collections.sort(complexObjectList, new Comparator<ComplexObject>() {
            public int compare(ComplexObject obj1, ComplexObject obj2) {
                return obj2.getValue().compareTo(obj1.getValue()); //compares 2 Double values, -1 if less , 0 if equal, 1 if greater
            }
        });

    //print objects from sorted list
    for(ComplexObject co : complexObjectList){
        System.out.println(co.getDescription1()+" "+co.getDescription2()+" "+co.getValue());
    }
}

出力:

テスト値 テスト値 100.0
anotherval anotherval 50.0
于 2014-12-08T13:38:59.050 に答える