繁体   English   中英

Java 2D ArrayList和排序

[英]Java 2D ArrayList and sorting

我需要按商品所在的过道对购物清单进行排序,例如:
[面包] [1]
[牛奶] [2]
[谷物] [3]

我打算使用ArrayList进行此操作,并且想知道如何制作2D ArrayList奖励问题:关于如何按过道编号排序的任何想法?

您没有开设可容纳您的物品和过道信息的课程吗? 就像是:

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

  // constructor + getters + setters 
}

如果不这样做,请考虑创建一个-与尝试将这些属性粘贴到另一个ArrayList中的ArrayList中相比,这绝对是一种更好的方法。 说完类后,您将需要为对象编写一个Comparator或使“ Item”本身可比较

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);

如果要对ArrayList的ArrayList进行排序,则可以使用ColumnComparator

如果要对自定义对象的ArrayList进行排序,则可以使用BeanComparator

我知道这个问题是很久以前问过的,但实际上我有同样的问题。 如果您不知道列表中有多少个变量,但这不是一个很大的数字,您可以为每个选择实现比较器。 例如

我有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及其“计算”在算法进行的每个单个比较中都会调用,因此效率非常低...尽管有这个事实,但这是一种解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM