按第二维排序2d数组

时间:2013-08-15 09:46:49

标签: java android multidimensional-array

我需要根据价格对商品进行分类。

每个项目的价格都存储在JSON数组中

我创建了一个二维数组来存储名称和价格

像这样......

    String [][] priceArray = new String [itemArray.length()] [2];

    for(int i = 0; i < itemArray.length(); i++)
    {
        //put the item name in the first dimension
        priceArray[i][0] = itemArray.getJSONObject(i).getString("name");

        //put the item price in the second dimension        
        priceArray[i][1] = itemArray.getJSONObject(i).getString("baseprice");       
    }

    //DEBUG TO SEE THE RESULTS
    for(int i = 0; i < priceArray.length; i++)
    {
        Log.i("Item name : Item Price", priceArray[i][0] + " : " + priceArray[i][1]);               
    }

这很好......但是我如何按第二维中的价格对数组进行排序?

这甚至是最好的方法吗?

4 个答案:

答案 0 :(得分:1)

我建议你创建自己的实体Price。并在您的循环中创建具有“name”和“baseprice”值的价格实体列表。然后,您可以使用Collections.sort()对列表进行排序 以及您自己的比较器,您可以指定如何比较Price对象。

答案 1 :(得分:1)

好像你在object denial。但是,在任意列上对二维数组进行排序相对容易。只需使用自定义比较器。 (下面的代码段中省略了检查列存在的错误。)

Arrays.sort(priceArray, new Comparator<String[]> {
    final int sortColumn = 1;

    @Override
    public int compare(String[] left, String right) {
        return left[sortColumn].compareTo(right[sortColumn]);
    }
});

答案 2 :(得分:1)

你可以试试这个

 int[][] array2D = {{1,1},{3,21},{5,8},{10,8}};

    Arrays.sort(array2D, new Comparator<int[]>() {
        public int compare(int[] first, int[] second) {
            return first[1] - second[1];
        }
    });

答案 3 :(得分:0)

更好的方法:利用OO编程,首先,创建一个包含名称和价格的类项目:

class Item {
    String name;
    BigDecimal price;

    public String toString() { return "ITEM: {name:" + name + ", price: " + price + "}" }
}

然后创建一个Items列表而不是一个2D数组:

List<Item> items = new ArrayList<Item>();

for(int i = 0; i < itemArray.length(); i++)
{
    Item item = new Item();
    item.name = itemArray.getJSONObject(i).getString("name");
    item.price = new BigDecimal(itemArray.getJSONObject(i).getString("baseprice"));
    items.add(item);
}

最后,如果您愿意,可以按名称订购:

// Sort by name
Collections.sort(items, new Comparator<Item>() {

    @Override
    public int compare(Item o1, Item o2) {
        return o1.name.compareTo(o2.name);
    }

});

// at this point, items will be ordered by name

或者如果您想按价格订购:

// Sort by price
Collections.sort(items, new Comparator<Item>() {

    @Override
    public int compare(Item o1, Item o2) {
        return o1.price.compareTo(o2.price);
    }
});

// at this point, items will be ordered by price

当然,我错过了一些小问题,比如使用getter和setter而不是直接访问Item的字段,但目的是表明这个想法。