在 Java 中实现一个包

Implementing a Bag in Java

我正在 java 中实现一袋整数,但我不确定该怎么做。我想使用 HashMap、LinkedHashMap、TreeMap、TreeSet 或 HashSet 来实现。我想做的一些事情是

  1. 能够统计某个元素出现的次数(所以我不能用集合)
  2. 无需立即删除重复整数的结构即可添加

到目前为止,我已经尝试过实现地图,但是当我尝试向地图添加内容时 运行 遇到了问题,因为我正在尝试实现一袋整数对象而不是键值对。

public class Bag<Integer> {
private int count = 0;
private HashMap <T, Integer> map; 

//class constructor 
public Bag(){ 
  this.map = new HashMap <T, Integer>(); 
}

链接哈希集最好吗?我想添加重复的整数。

如果我没看错你的问题,你只是想

Map<Integer, Integer> integerBag = new HashMap<>();

Key:代表你包里的不同整数。

Value: 表示 count 相应键被添加的频率。

添加 "new" 整数时,您 put(newValue, 1) 进入地图。当相同的数字进来时,你增加那个计数器;并在移除时减少。

除此之外:

没有立即删除重复整数的结构没有多大意义。整数只是数字;你为什么要记住“6 6 6”...当你可以记住 "I got 6 three times" 而不是?!

鉴于您的评论:

  • 您不需要更改方法的签名。编译器生成代码以自动将基本类型(如 int)转换为它们的大哥(如 Integer)。这就是所谓的自动装箱。
  • 但您也可以手动执行此操作。

看这里:

int intval =5;
Integer asInteger  = Integer.valueOf(intval);
if (Integer bag.contains(asInteger)) { 

只需使用一个 HashMap。你可能想计算你有多少重复:

Map<Whatever, Long> bag = new HashMap<>();

要添加元素,请使用 merge 方法:

bag.merge(someElement, 1, (oldValue, value) -> oldValue + 1);

要删除元素,您可能需要使用 computeIfPresent 方法:

bag.computeIfPresent(someElement, (key, value) -> (value == 1 ? null : value - 1));

由于您的要求 #2,我认为您不能使用任何基于散列的集合。如果您需要保留重复的整数,则需要使用列表。

添加新项目很容易,只需在列表中调用 add() 即可。查找所有项目需要一个短循环;要计算它们,只需在结果列表中调用 size()

以下代码未经测试。

public class Bag<T> {
   private List<T> items = new ArrayList<>(); 

   public void add( T i ) { items.add(i); }
   public List<T> findAll( T target ) {
      ArrayList<T> retVal = new ArrayList<>();
      for( T i : items ) {
         if( i.equals(target) )
            retVal.add( i );
      }
      return retVal;
   }
}