用Java实现一个包

时间:2017-04-18 19:48:46

标签: java hashmap hashset linkedhashset

我在java中实现了一包Integers,我不知道该怎么做。我想用HashMap,LinkedHashMap,TreeMap,TreeSet或HashSet这样做。我想做的一些事情是

  1. 能够计算某个元素的出现次数(所以我不能使用一个集合)
  2. 能够在没有结构的情况下立即删除重复的整数
  3. 到目前为止,我尝试过实现一个地图,但是当我尝试添加到地图时遇到问题,因为我正在尝试实现一个整数对象而不是键值对。

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

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

3 个答案:

答案 0 :(得分:1)

如果我正确地阅读了你的问题,你只需要

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

键:代表你手中的不同整数。

值:表示计数添加相应键的频率。

添加&#34;新&#34;整数,你put(newValue, 1)进入地图。当相同的数字出现时,你增加那个计数器;并减少删除。

除此之外:

没有立即删除重复整数的结构没有多大意义。整数只是数字;你为什么要记住&#34; 6 6 6&#34; ......当你记得&#34;我得到了6次&#34;呢?!

鉴于您的意见:

  • 您不需要更改方法的签名。编译器生成代码以将诸如int之类的原始类型自动转换为其兄弟,例如Integer。这叫做自动拳击。
  • 但您也可以手动执行此操作。

见这里:

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

答案 1 :(得分:0)

只需使用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 :(得分:0)

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

添加新项目很简单,只需在列表中调用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;
   }
}