【问题标题】:Sort 2d array by 2nd dimension按二维对二维数组进行排序
【发布时间】:2013-08-17 11:50:34
【问题描述】:

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

每件商品的价格存储在 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]);               
    }

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

这是最好的方法吗?

【问题讨论】:

标签: java android multidimensional-array


【解决方案1】:

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

class Item {
    String name;
    BigDecimal price;

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

然后创建一个项目列表而不是二维数组:

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”
  • 我更新了我的答案,我将toString() 添加到Item 所以当你使用System.out.println() 时它会打印出更友好的结果
  • 我已经弄清楚我现在做错了什么......它现在按照我想要的方式工作。谢谢!
【解决方案2】:

你可以试试这个

 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】:

    您似乎在object denial。尽管如此,在任意列上对二维数组进行排序还是相对容易的。只需使用自定义比较器。 (下面的 sn-p 中省略了对列存在的错误检查。)

    Arrays.sort(priceArray, new Comparator<String[]> {
        final int sortColumn = 1;
    
        @Override
        public int compare(String[] left, String right) {
            return left[sortColumn].compareTo(right[sortColumn]);
        }
    });
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 谢谢,但我不确定我是否完全理解,你能提供一个代码示例吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2011-10-25
      • 2015-09-17
      • 2020-08-14
      相关资源
      最近更新 更多