10

私がこのようなテーブルを持っているとしましょう:

 String | Int1 | Int2
 "foo"    5      0
 "faa"    4      1
 "zaa"    0      1
 "zoo"    4      2
 "laa"    4      3
 "loo"    1      4

私が取得したいのは、次のようなテーブルです。

 String | Int1 | Int2
 "foo"    5      0
 "laa"    4      3
 "zoo"    4      2
 "faa"    4      1
 "loo"    1      4
 "zaa"    0      1

最初に発生するのは、列に基づく並べ替えですInt1

次に発生するのは、列に基づくものですがInt2、列に同じ番号がある行のみに基づいていますInt1

データベースエンジンを使用せずにこの問題にどのように対処する必要がありますか?

4

7 に答える 7

10

通常、これは、3つの値すべてを含む型であるList<Item>whereを使用して行いItemます(たとえば、 "foo"、最初の行の場合は5、0)。

次に、で提示された2つのオブジェクトComparator<Item>のInt1値を比較するを記述し、それが明確な答えを与えた場合は、その答えを返します...それ以外の場合はInt2値を比較します。Itemcompare

于 2011-07-29T19:29:37.660 に答える
4

2つのintを持つ文字列を持つオブジェクトがあると思いますか?

これを行う最も簡単な方法は、オブジェクトにメソッドComparableを実装して実装させるcompareTo()ことです。または、コンパレータをに渡すことができますCollections.sort(yourListOfObjects, yourCustomComparator)

compareTo()メソッドは、最初に最初のintを比較し、それらが等しい場合は2番目のintを比較します。

@Override
public int compareTo(MyObject o) {
    // compare int1s .. if equal, compare int2s and return 0,1 or -1
}

ここに役立つリンクがあります

http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

于 2011-07-29T19:30:00.607 に答える
4

テーブルの意味がよくわかりません。ただし、一般的なケースでは、Java でデータをソートするには、 を使用するComparatorか、データ構造を実装しComparableます。あなたの場合、テーブル内の行をカプセル化する単純なデータ構造を作成してComparatorから、行データ構造の を作成するか、実装しComparableます。

例えば

public class Row implements Comparable<Row> {
    public final String theString;
    public final int int1;
    public final int int2;

    public Row(String theString, int int1, int int2) {
        this.theString = theString;
        this.int1 = int1;
        this.int2 = int2;
   }

   public int compareTo(Row other) {
       if(this.int1 == other.int1) {
           return new Integer(this.int2).compareTo(other.int2);
       }

       return new Integer(this.int1).compareTo(other.int1);
   }
}

次に、 を作成し、List<Row>それを使用java.util.Collections.sort(List<?>)してデータを並べ替えます。

于 2011-07-29T19:39:45.700 に答える
2

Javaのみがラムダをサポートしている場合...これは非常に多くの言語で簡単です。

しかし、うーん、見てみましょう。ここに2つの一般的なアプローチがあります(これらのテーマには多くの異なるバリエーションがあります):

  1. 問題のメンバーで新しいタイプを作成します
  2. タイプを実装しますComparable(例:「compareTo」)
  3. この新しいタイプの要素を配列またはリストに入れます(おそらくList<NewType>
  4. Arrays.sortまたはCollections.sort(または同様のもの)を使用する

または、

  1. ネストされた配列またはリストを作成します(おそらくList<List<Object>>
  2. を使用するArrays.sortまたはCollections.sort(または同様の)フォームを使用してComparator

ハッピーコーディング。

于 2011-07-29T19:31:29.320 に答える
2

まず、「テーブル」の意味を定義します。

オブジェクト内の各行をラップしRow、これらの の配列を保持しますRow。次に、インターフェイスを実装するかComparable<Row>、独自のComparator<Row>.

したがって、次のいずれかです。

...
class Row implements Comparable<Row> {
    String s;
    int int1, int2;

    ...

    public int compareTo( Row r ) {
        if( int1 != r.int1 ) return int1-r.int1;
        else return int2-r.int2;
    }
}

そして電話するArrays.sort(rows);

または、これを行うことができます:

Arrays.sort(rows, new Comparator<Row>() {
    public int compare( Row r1, Row r2 ) {
        if( r1.int1 != r2.int1 ) return r1.int1-r2.int1;
        else return r1.int2-r2.int2;
    }
});

はどこrowsですかRow[]

于 2011-07-29T19:33:44.433 に答える
1

このようなもの?

public class Item implements Comparable<Item> {
    private String s;
    private Integer int1;
    private Integer int2;

    @Override
    public int compareTo(Item o) {
        int compare = int1.compareTo(o.int1);
        return compare != 0 ? compare : int2.compareTo(o.int2);
    }
}
于 2011-07-29T19:36:43.660 に答える
-1

Comparator 実装内で CompareToBuilder を使用します。

使用例、

    new Comparator<YourObjectType>() {
            @Override
            public int compare(YourObjectType o1, YourObjectType o2) {
                return new CompareToBuilder()
                   .append(o1.firstFieldToCompare, o2.firstFieldToCompare)
                   .append(o1.secondFieldToCompare, o2.secondFieldToCompare)
                   .toComparison();
            }
        }
于 2016-07-04T20:56:29.963 に答える