【问题标题】:How to create a List with duplicated Objects displayed as: "2 x element1, 5 x element2, 3 x element4" Etc?如何创建一个包含重复对象的列表,显示为:\"2 x element1, 5 x element2, 3 x element4\" 等等?
【发布时间】:2023-01-26 00:13:05
【问题描述】:

样本:

ArrayList Object cartList = new ArrayList<>();

对象有 2 个参数:名称、价格。

cartList 中的对象可以是这样的:

  1. 汉堡1
  2. 汉堡1
  3. 汉堡3
  4. 汉堡2
  5. 汉堡1
  6. 汉堡4
  7. 汉堡3

    我想创建方法 - displayCartList()。我需要显示这样的项目:

    您购物车中的商品:

    3 x 汉堡包1 2 x 汉堡3 1 x 汉堡包2 1 x 汉堡包4

    如何实现这样的排序/显示?

    我尝试了几件事,但我无法弄清楚。

【问题讨论】:

  • 我建议使用Map&lt;Whatever, Integer&gt;

标签: java sorting arraylist display


【解决方案1】:

要创建一个包含重复对象的列表,显示为“2 x element1、5 x element2、3 x element4”等,您可以结合使用 Java Map 接口和 Collections.frequency() 方法。

首先,您可以使用 HashMap 将对象存储为键并将它们的频率存储为值。然后,您可以遍历 ArrayList 并使用 put() 方法将对象添加到地图并增加频率值(如果地图中已存在该对象)。

接下来,您可以使用 Collections.frequency() 方法获取 ArrayList 中每个对象的频率。

以下是如何实现 displayCartList() 方法的示例:

public void displayCartList() {
    HashMap<Object, Integer> map = new HashMap<>();
    for (Object obj : cartList) {
        if (map.containsKey(obj)) {
            map.put(obj, map.get(obj) + 1);
        } else {
            map.put(obj, 1);
        }
    }
    System.out.println("Items in your Cart:");
    for (Object obj : map.keySet()) {
        System.out.println(map.get(obj) + " x " + obj.getName());
    }
}

此方法将遍历 cartList 并创建一个 HashMap,其中对象作为键,它们的频率作为值。然后它通过遍历映射中的键并显示每个对象的频率和名称来打印出购物车中的项目。

您还可以对要在购物车中显示的项目列表进行排序,您可以使用 Collections.sort() 方法按名称对列表进行排序。

 public void displayCartList() {
    HashMap<Object, Integer> map = new HashMap<>();
    for (Object obj : cartList) {
        if (map.containsKey(obj)) {
            map.put(obj, map.get(obj) + 1);
        } else {
            map.put(obj, 1);
        }
    }
    System.out.println("Items in your Cart:");
    List<Object> list = new ArrayList<>(map.keySet());
    Collections.sort(list, new Comparator<Object>() {
        @Override
        public int compare(Object o1, Object o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });
    for (Object obj : list) {
        System.out.println(map.get(obj) + " x " + obj.getName());
    }
}

这样您就可以将购物车中的商品按名称排序

请注意,上面的示例假定您的 Object 类有一个返回对象名称的 getName() 方法。如果该类有不同的方法或属性来访问名称,您应该相应地调整代码。

【讨论】:

  • Object上没有方法getName() --- 比较器可以简化为:Comparator.comparing(Whatever::getName)(假设Whatever有一个方法getName(),返回一个Comparable&lt;...&gt;)。 --- 我们可以调用list.sort(...)而不是Collections.sort(list, ....)
  • @Turing85 你是对的,对于造成的混乱,我深表歉意。 Object 类没有 getName() 方法,您应该使用具有 getName() 方法的对象的类,并且它应该返回一个 Comparable。关于排序,您也是正确的,您可以通过使用 Comparator.comparing(Whatever::getName) 来简化比较器,假设类 Whatever 有一个返回 Comparable 的方法 getName()。你也可以直接调用 list.sort(...) 方法而不是使用 Collections.sort(list, ...)。这是 displayCartList() 方法的更新示例:
猜你喜欢
  • 2023-03-19
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多