按第二维度对二维数组进行排序

4

我需要根据物品的价格对它们进行排序。

每个物品的价格都存储在一个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]);               
    }

这个代码已经可以正常工作了... 但是我怎么才能按照第二维中价格的大小对数组进行排序呢?

这样做是否是最佳方式呢?


为什么要加上Android标签?你知道添加无关的标签会导致人们忽略你的帖子吗? - Majid Laissi
请参考以下链接以获取相关问题的解答:https://dev59.com/91HTa4cB1Zd3GeqPU9FR https://dev59.com/d2445IYBdhLWcg3wWY8U http://stackoverflow.com/questions/10321123/need-help-sorting-two-dimensional-arrays-by-second-element-and-then-by-first-ele - Paul Renton
@Majid L,实际上是为了一个安卓应用程序...我将在未来让这更加清晰。 - Louis Evans
4个回答

1

看起来你遇到了对象拒绝的问题。不过,对于任意列排序二维数组相对容易。只需使用自定义比较器即可。(下面的代码片段省略了列存在性的错误检查。)

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

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

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

1
我建议您创建自己的实体Price。在循环中,创建带有“名称”和“基础价格”值的Price实体列表。然后,您可以使用Collections.sort()和您自己的比较器对列表进行排序,其中您可以指定比较Price对象的方式。

谢谢,但我不确定我完全理解了,你能否提供一个代码示例? - Louis Evans

0
更好的方法是利用面向对象编程,首先创建一个名为Item的类来包含名称和价格:
class Item {
    String name;
    BigDecimal price;

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

那么创建一个项目列表而不是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字段,但意图是展示这个想法。


我已经尝试过这个了...但是当我打印结果进行测试时,我得到的是:" {packagename}.ItemList$Item@41f6ba68" <-- 最后一个数字会改变。 - Louis Evans
我更新了我的答案,我在Item中添加了toString()方法,这样当您使用System.out.println()时,它会打印出更友好的结果。 - morgano
我现在弄清楚了我之前做错了什么...现在它按照我想要的方式工作了。谢谢! - Louis Evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接