在 Java 中实现一个包
Implementing a Bag in Java
我正在 java 中实现一袋整数,但我不确定该怎么做。我想使用 HashMap、LinkedHashMap、TreeMap、TreeSet 或 HashSet 来实现。我想做的一些事情是
- 能够统计某个元素出现的次数(所以我不能用集合)
- 无需立即删除重复整数的结构即可添加
到目前为止,我已经尝试过实现地图,但是当我尝试向地图添加内容时 运行 遇到了问题,因为我正在尝试实现一袋整数对象而不是键值对。
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;
}
}
我正在 java 中实现一袋整数,但我不确定该怎么做。我想使用 HashMap、LinkedHashMap、TreeMap、TreeSet 或 HashSet 来实现。我想做的一些事情是
- 能够统计某个元素出现的次数(所以我不能用集合)
- 无需立即删除重复整数的结构即可添加
到目前为止,我已经尝试过实现地图,但是当我尝试向地图添加内容时 运行 遇到了问题,因为我正在尝试实现一袋整数对象而不是键值对。
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;
}
}