2013-02-28 3 views
0

Я читаю файл с разделителями в пользовательский объект под названием «Держатель». Держатель содержит список пользовательских объектов, называемых «Запись». Каждая запись представляет собой пользовательские объекты под названием «Поле». Каждое поле имеет строковое имя и String ЗначениеСортировка списка по атрибуту в подписок в java

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 из базы данных на основе первого пункта на линии. Вот пример файла я потянув в (номера строк - они также будут иметь индексы Record - начиная с 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. Ex: Для первого "B" запись (строка 1), A Record 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 это тип и количество элементов для сортировки по изменениям. Линейные типы могут быть добавлены/отобраны, и поля могут измениться. Поэтому мне действительно нужно что-то общее, насколько это возможно.

Будет заказано в том порядке, в котором находится поле. Так это будет отсортирован по FieldList.getValue(0), FieldList.getValue(1), .... FieldList.getValue(FieldList.size() - 1)

Итак, это порядок номера строк должно быть в том, когда это делается:

0 
3 
1 
2 
4 
5 
7 
6 

Какой самый лучший/самый эффективный способ сделать такого рода?

Заранее благодарен!

ответ

1

Игнорируя все возможности нулей, как об этом на 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, то все это становится гораздо более грязным ...

+0

Первая часть с lenDiff не будет обязательно, потому что некоторые более поздние типы короче предыдущих. Не уточнил, что в вопросе, моя вина. Я попробую за выходные и отчитаюсь. Похоже, что я хочу. Благодаря! – AgentBawls

Смежные вопросы