问题
我是Java新手,非常困惑。
我有一个长度为4int[]的大型数据集,我想计算4个整数的每个特定组合出现的次数。这与计算文档中的单词频率非常相似。
我想创建一个aMap,它将每个int []映射到一个运行计数,因为列表被迭代,但Map不采用原始类型。
所以我制作了Map
我的数据存储为aArrayList所以我的循环应该是这样的
ArrayList data = ... // load a dataset`
Map frequencies = new HashMap();
for(int[] q : data) {
//**DO SOMETHING TO convert q from int[] to Integer[] so I can put it in the map
if(frequencies.containsKey(q)) {
frequencies.put(q, tfs.get(q) + p);
} else {
frequencies.put(q, p);
}
}
我不确定我在评论中需要哪些代码才能将此工作转换为int[]到Integer[]。或者我可能从根本上对正确的方法感到困惑。
#1 热门回答(104 赞)
#Native Java 8(一行)
使用Java 8,int[]可以很容易地转换为Integer[]:
int[] data = {1,2,3,4,5,6,7,8,9,10};
// To boxed array
Integer[] what = Arrays.stream( data ).boxed().toArray( Integer[]::new );
Integer[] ever = IntStream.of( data ).boxed().toArray( Integer[]::new );
// To boxed list
List you = Arrays.stream( data ).boxed().collect( Collectors.toList() );
List like = IntStream.of( data ).boxed().collect( Collectors.toList() );
正如其他人所说,Integer[]通常不是一个好的 Map 密钥。但就转换而言,我们现在拥有一个相对干净的本机代码。
#2 热门回答(69 赞)
如果要将anint[]转换为anInteger[],则无法在JDK中自动执行此操作。但是,你可以这样做:
int[] oldArray;
... // Here you would assign and fill oldArray
Integer[] newArray = new Integer[oldArray.length];
int i = 0;
for (int value : oldArray) {
newArray[i++] = Integer.valueOf(value);
}
如果你有权访问Apache langlibrary,那么你可以像这样使用ArrayUtils.toObject(int[])方法:
Integer[] newArray = ArrayUtils.toObject(oldArray);
#3 热门回答(8 赞)
据推测,你希望映射的键匹配元素的值而不是数组的标识。在这种情况下,你需要某种对象来定义你期望的equals和hashCode。最简单的是转换为aList,无论是anArrayList还是更好用Arrays.asList。更好的是你可以引入一个代表数据的类(类似于java.awt.Rectangle但我建议将变量设为私有,最后也是类最终)。