Java 2D ArrayList и сортировка

Мне нужно отсортировать список покупок по проходу, в котором находится товар, например:
[Хлеб] [1]
[Молоко] [2]
[Злаки] [3]

Я планирую сделать это с ArrayList, и мне было интересно, как сделать бонусные вопросы 2D ArrayList: есть идеи о том, как сортировать по номеру прохода?


person Raptrex    schedule 03.10.2009    source источник


Ответы (3)


Разве у вас нет класса, который содержит информацию о вашем товаре + проходе? Что-то типа:

public class Item {
  private String name;
  private int aisle;

  // constructor + getters + setters 
}

Если вы этого не сделаете, рассмотрите возможность создания одного — это определенно лучший подход, чем попытка вставить эти атрибуты в ArrayList внутри другого ArrayList. После того, как у вас есть указанный класс, вам нужно либо написать Компаратор для ваших объектов или создайте "Элемент" Сопоставимо само по себе:

public class Item implements Comparable<Item> {
  .. same stuff as above...

  public int compareTo(Item other) {
    return this.getAisle() - other.getAisle();
  }
}

Затем все, что вы делаете, это вызываете сортировку:

List<Item> items = new ArrayList<Item>();
... populate the list ...
Collections.sort(items);
person ChssPly76    schedule 03.10.2009
comment
я должен был бы сделать несколько объектов или что-то в этом роде, потому что причина, по которой я думал об использовании ArrayList, заключалась в том, что я не знаю, сколько элементов будет - person Raptrex; 03.10.2009
comment
Да, вам придется создать несколько экземпляров Item и добавить их в ArrayList. items.add(new Item("Bread", 1)); items.add(new Item("Milk", 2)); и т.д... - person ChssPly76; 03.10.2009


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

У меня есть ArrayList<ArrayList<Object>> и я хочу отсортировать его по столбцу, и я знаю, что вложенный список состоит из переменного количества объектов, которые я могу просто реализовать компаратор для каждого возможного значения:

public class SecondColumnComparator implements Comparator {

public static boolean isNumeric(String str) {
    try {
        Integer integer = Integer.parseInt(str);
    } catch (NumberFormatException nfe) {
        return false;
    }
    return true;
}

@Override
public int compare(Object o1, Object o2) {

    if (isNumeric(((ArrayList<String>) o1).get(1))) {

        Integer firstInteger = Integer.parseInt(((ArrayList<String>) o1).get(1));
        Integer secondInteger = Integer.parseInt(((ArrayList<String>) o2).get(1));

        return firstInteger.compareTo(secondInteger);

    }
    if (((ArrayList<Object>) o1).get(1) instanceof String) {

        String firstString = ((ArrayList<String>) o1).get(1);
        String secondString = ((ArrayList<String>) o2).get(1);

        return firstString.compareTo(secondString);
    }

    throw new Exception();
}

}

И назовите это так:

        switch (valueSelected) {
        case 0:
            Collections.sort(this.listOfLists, new FirstColumnComparator());
            break;
        case 1:
            Collections.sort(this.listOfLists, new SecondColumnComparator());
            break;
        case 2:
            Collections.sort(this.listOfLists, new ThirdColumnComparator());
            break;
        case 3:
            Collections.sort(this.listOfLists, new FourthColumnComparator());
            break;
        default:

    }

В каждом компараторе просто изменяйте .get(x), где x - номер столбца, по которому вы хотите сортировать.

Функция boolean isNumeric(String str); может использоваться, потому что вы не можете хранить объекты разных типов в одном списке, поэтому я помещаю распознавание этого в компаратор и анализирую String для любого другого типа.

Помните, что этот comparator и его «вычисления» вызываются для каждого сравнения, сделанного алгоритмом, поэтому он крайне неэффективен... Несмотря на этот факт, это своего рода решение.

person Jacob    schedule 10.07.2013