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

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

2 голосов
/ 03 октября 2009

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

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

Ответы [ 3 ]

5 голосов
/ 03 октября 2009

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

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

  // constructor + getters + setters 
}

Если вы этого не сделаете, подумайте над тем, чтобы сделать один - это определенно лучший подход, чем пытаться вставить эти атрибуты в ArrayList в другом ArrayList. После того как вы произнесете класс, вам нужно будет либо написать Comparator для ваших объектов, либо сделать 'Item' Comparable для себя:

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

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

Тогда все, что вы делаете, это вызываете sort:

List<Item> items = new ArrayList<Item>();
... populate the list ...
Collections.sort(items);
0 голосов
/ 10 июля 2013

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

У меня есть 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 и его "расчеты" вызываются для каждого отдельного сравнения, сделанного алгоритмом, поэтому он крайне неэффективен ... Несмотря на этот факт, это своего рода решение.

0 голосов
/ 03 октября 2009

Если вы хотите отсортировать ArrayList из ArrayLists, вы можете использовать ColumnComparator .

Если вы хотите отсортировать ArrayList вашего пользовательского объекта, вы можете использовать BeanComparator .

...