0

区切りファイルを「Holder」というカスタム オブジェクトに読み込んでいます。ホルダーには、「レコード」と呼ばれるカスタム オブジェクトのリストが含まれています。各レコードは、「フィールド」と呼ばれるカスタム オブジェクトのリストです。各フィールドには文字列名と文字列値があります

public class Holder{
    private List RecordList;
    /* constructors and methods */
}

public class Record{
    private List FieldList
    /* constructors and methods */
}

public class Field{
    private String Name;
    private String Value;
    /* constructors and methods */
}

行の最初の項目に基づいて、データベースから Field オブジェクトの名前を取得しています。これは、私がプルしているファイルのサンプルです (行番号 - それらはレコード インデックスでもあります - 説明を簡単にするために 0 から始まります):

0 - A,123
1 - B,123,123456
2 - B,123,654321
3 - B,123,112233
4 - C,123,choice1,1/1/2011,12/31/2011
5 - C,123,choice2,1/1/2011,12/31/2011
6 - D,123,choice1,1/1/2011,12/31/2011,654321
7 - D,123,choice1,1/1/2011,12/31/2011,112233

ホルダーはRecordオブジェクトのリストを保存します。各行は、Recordオブジェクトのリストを格納するオブジェクトになりFieldます。Valueコンマ間の各文字列は、オブジェクト上で独自のものになりFieldます。例: 最初の "B" レコード (1 行目) の場合、ARecord BLine1オブジェクトは次のようになります。

BLine1.getFieldList.get(0).getName() = "LineType"  //set from DAO not shown
BLine1.getFieldList.get(0).getValue() = "B"

BLine1.getFieldList.get(1).getName() = "Number"    //set from DAO not shown
BLine1.getFieldList.get(1).getValue() = "123"

BLine1.getFieldList.get(2).getName() = "Selection"  //set from DAO not shown
BLine1.getFieldList.get(2).getValue() = "123456"

このリストをすべてのフィールドでソートする必要があります。ただし、LineType によって、並べ替える項目の種類と数が変わります。LineType は追加/削除でき、フィールドは変更できます。だから私は本当にできるだけ一般的なものが必要です。

フィールドが行にある順序で並べられます。でソートされますので、FieldList.getValue(0), FieldList.getValue(1), .... FieldList.getValue(FieldList.size() - 1)

したがって、これは完了時の行番号の順序です。

0
3   
1
2
4
5
7
6

この種の最善/最も効率的な方法は何ですか?

前もって感謝します!

4

1 に答える 1

1

null の可能性をすべて無視して、Comparator<Record>

public int compare(Record r1, Record r2) {
  // if one field list is longer than the other treat that one as greater
  int lenDiff = r1.getFieldList().size() - r2.getFieldList().size();
  if(lenDiff != 0) return lenDiff;

  // both field lists same length, do lexicographic comparison
  Iterator<Field> it1 = r1.getFieldList().iterator();
  Iterator<Field> it2 = r2.getFieldList().iterator();
  while(it1.hasNext()) {
    Field f1 = it1.next();
    Field f2 = it2.next();
    int diff = f1.getValue().compareTo(f2.getValue());
    if(diff != 0) return diff;
  }

  // all components equal, so both lists equal.
  return 0;
}

でこれを使用できますCollections.sort

明らかに、レコード、フィールドnullを持つレコード、または値nullを持つフィールドがあるnull場合、すべてがかなり面倒になります...

于 2013-02-28T20:00:25.807 に答える