Сортировка ArrayLIst - PullRequest
       8

Сортировка ArrayLIst

0 голосов
/ 22 марта 2011

Как я могу отсортировать ArrayList в Java без использования компаратора .?

Я уже использовал компаратор, и он не работает для меня должным образом, означает, что данные не в особой манере.

У меня есть один список массивов, который содержит следующие свойства ...

getTotal(),
getID(),
getRank(),
getItemName(),
getFinalRank()

Я разбил все это на один массив itemWiseDetails

сейчасЯ хочу сделать отчет по и показать все эти детали, но в соответствии с рангом этого itemName.И еще одна вещь, в которой мой ранг находится в строке, поэтому, когда я попытался отсортировать на основе этого ранга, он принимает данные N / A как ранг 0, поэтому сначала отображается, затем отображается первый ранг, затем второй и продолжается.

Итак, я хочу отсортировать этот itemWiseDetails список без компаратора

Заранее спасибо,

Я реализовал Comparator следующим образом

 public int compareTo(Object itemDetailVO) 
    {
    if (!(itemDetailVOinstanceof ItemDetailVO)) throw new ClassCastException("AItemDetailVOobject expected."); 
    int otherItemRank = Integer.parseInt(((ItemDetailVO) itemDetailVO).getRank().toString()); 
return Integer.parseInt(this.trLotRank.toString())- otherBidderRank;
    }

Ответы [ 4 ]

5 голосов
/ 22 марта 2011

У вас есть два варианта:

  • Заставьте ваш класс реализовать Comparable и вызвать Collections.sort без указания компаратора
  • Реализуйте компаратор правильно

Похоже, вы подходите так: «Я попробовал X, и это не сработало, поэтому мне нужно попробовать что-то другое» - но причина, по которой X (с помощью компаратора) не сработала, заключается в том, что ваш компаратор были ошибки ... он не сравнивал элементы так, как вы хотели. Вы столкнетесь с точно такой же проблемой, когда будете внедрять Comparable. У вас все еще есть та же самая фундаментальная работа (разработка, как сравнить два элемента) - это действительно просто вопрос , где , что логика идет.

В целом реализация Comparator является более гибким подходом, поскольку позволяет сортировать коллекцию различными способами в зависимости от ваших потребностей. Это также позволяет вам сортировать коллекции, где вы не можете изменить код внутри самого класса элемента. Я бы лично придерживался подхода Comparator.

Напишите несколько модульных тестов, сравнивающих различные элементы, а затем внедрите компаратор, чтобы эти тесты прошли. Затем, если вы обнаружите еще какие-то проблемы, добавьте тест для этого случая и сделайте так, чтобы тоже прошел 1021 *. Повторяйте, пока ваш компаратор не будет работать правильно.

3 голосов
/ 22 марта 2011

Хорошо, давайте исправим (или переписаем) ваш компаратор.

public class ItemDetailVOComparator implements Comparator<ItemDetailVO> {

  public int compare(ItemDetailVO itemDetailVO1, ItemDetailVO itemDetailVO2) {
    String rank1 = itemDetailVO1.getRank();
    String rank2 = itemDetailVO1.getRank();
    if (rank1 == null && rank2 == null) {
      return 0;
    }
    // invert 1 and -1 if nulls should appear first
    if (rank1 == null) {
      return 1;
    }
    if (rank2 == null) {
      return -1;
    }
    // nothing can be null at this point
    return rank1.compareTo(rank2);
  }    
}

Это легче читать ... и оно работает: -)

1 голос
/ 22 марта 2011

Вы можете попробовать использовать компаратор:

public static List sort(List list) {
      Collections.sort(list, new Comparator() {

        public int compare(Object o1, Object o2) {
             String s1 = (String)o1;
             String s2 = (String)o2;

             String integer1[] = s1.split("[^0-9]");      // <<<<<  changed
             String integer2[] = s2.split("[^0-9]");      // <<<<<  changed
             String chars1[] = s1.split("[0-9]+");         // <<<<<  changed
             String chars2[] = s2.split("[0-9]+");         // <<<<<  changed

             Integer i1 = new Integer( Integer.parseInt(integer1[0]) );
             Integer i2 = new Integer( Integer.parseInt(integer2[0]) );

             if (i1.equals(i2))
                return chars1[1].compareTo(chars2[1]);
              else
                 return i1.compareTo(i2);
        }
    });
    return list;
}

Ввод:

String i [] = {"115", "1125", "147", "37", "57", "37"};

Выход:

37 37 57 115 147 1125

1 голос
/ 22 марта 2011

Чтобы ответить на первый вопрос:

java.util.Collections.sort(itemWiseDetails);

Для решения вашей проблемы: Напишите правильный компаратор.Скорее всего, у вас не было одного из обязательных свойств , и поэтому он дал противоречивые результаты.Если вам нужна помощь в этом, не стесняйтесь публиковать свою (короткую!) Структуру данных, пожелания по сортировке и текущий компаратор в том или ином вопросе.

...