【问题标题】:Use Collections.frequency with a List<SomeBeanType>将 Collections.frequency 与 List<SomeBeanType> 一起使用
【发布时间】:2013-08-15 14:59:05
【问题描述】:

我有一些 bean 类型(产品)的列表,我需要从我的列表中找到重复的产品,假设我的 bean Products 包含像这样的 getter 和 setter

public class Product {
 private int id;
 private String name;
 private BigDecimal cost;
 private int uniqueAssignedId;

 public Product(int id, String name, BigDecimal cost, int uniqueAssignedId) {
  this.id = id.....
 }

 public int getId() {
  return this.id;
 }

//The rest of getters and setters.

我正在尝试将此列表放入地图中以查找重复的“id”值,但它没有按预期工作,问题是我的列表是已售产品的列表(抱歉冗余)所以每个售出的产品都有一个唯一的 uniqueAssignedId 因此对象总是不同的,假设我的列表填充如下:

listProducts.add(5, "Soda", 1.00, 1);
listProducts.add(3,"Phone", 300.00, 2);
listProducts.add(4, "Cofee", 5.00, 3);
listProducts.add(5, "Soda", 1.00, 4);
listProducts.add(4, "Cofee", 5.00, 5);
listProducts.add(5, "Soda", 1.00, 6);

(我知道我必须创建一个对象 Product product = new Product() 并用 setter 填充它,然后将对象添加到我的列表中,但这更简单)

到目前为止我所尝试的:

Set<Product> uniqueId = new HashSet<Product>(listProducts);
        for (Product product : uniqueId) {
            System.out.println("The product with id "+product.getId+" was repeated: "
                    + Collections.frequency(listProducts, product.getId));
        }

但它总是迭代 6 次而不是 3 次(3 是我销售的不同产品的数量)。那么我怎样才能让 Hashset 只得到不同的 id 呢?我应该使用地图吗?任何线索将不胜感激。

【问题讨论】:

  • 你是否在 Product 类中重写了 equalshashcode 方法?
  • 我没有尝试过,因为我真的不知道该怎么做,我已经阅读了如何覆盖方法但我根本不明白。
  • 没关系,当我创建我的 Bean 时,Netbeans 会自动覆盖等号和哈希码,但正如我告诉你的,我不知道如何处理它:/
  • IMO,将 uniqueAssignedId 添加到 Product 并不是很好的设计方式。并且将 Products equalshashCode 方法基于该字段是没有意义的。您可能希望使用 uniqueAssignedIdproduct 字段创建另一个类 SoldProduct。它的equals和hashCode可以基于该id字段。
  • 发布你的 equals 和 hashcode 方法。如果它们在比较中包含 uniqueAssignedId,则两个产品永远不会相等。

标签: java list hashset


【解决方案1】:
  public class ProductComparator implements Comparator<Product>
  {
     public int compare(Product p1, Product p2)
     {
          return p1.id-p2.id;
     }
  }


  ArrayList<Product> listProducts = new ArrayList<Product>();
  listProducts.add(new Product(5, "Soda", 1.00, 1));
  listProducts.add(new Product(3,"Phone", 300.00, 2));
  listProducts.add(new Product(4, "Cofee", 5.00, 3));
  listProducts.add(new Product(5, "Soda", 1.00, 4));
  listProducts.add(new Product(4, "Cofee", 5.00, 5));
  listProducts.add(new Product(5, "Soda", 1.00, 6));
  System.out.println(listProducts.size()); // Total records 

  TreeSet<Product> products = new TreeSet<Product>(new ProductComparator());
  products.addAll(listProducts);                
  ArrayList<Product> duplicate = new ArrayList<Product>();
  duplicate.addAll(products);
  listProducts.removeAll(duplicate);
  System.out.println(products.size()); // Now no duplicates in this set. 
  System.out.println(listProducts.size()); // Now only duplicate in this list

【讨论】:

  • 谢谢,但我想做的是用 Collections.frequency 计算重复元素,而不是删除它们。
【解决方案2】:

您可以使用 Comparable interface 或 Comparator 对 List 进行排序。

Java 中的 Comparator 比较提供的两个对象,而 Comparable 接口将“this”引用与指定的对象进行比较。

Java 中的 Comparable 用于实现对象的自然排序。在 Java API String、Date 和包装类实现 Comparable 界面。

它将根据计数返回一个排序列表。可以使用简单的编程进行排序并从中检索计数。

请参考Comparable interfaceComparator。看看Here 的例子。

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2013-10-14
    • 2017-08-13
    • 2017-10-19
    • 2020-11-07
    • 2013-03-10
    • 2021-05-18
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多