问题
我是Java新手,非常困惑。
我有一个长度为4int[]
的大型数据集,我想计算4个整数的每个特定组合出现的次数。这与计算文档中的单词频率非常相似。
我想创建一个aMap<int[], double>
,它将每个int []映射到一个运行计数,因为列表被迭代,但Map不采用原始类型。
所以我制作了Map<Integer[], Double>
我的数据存储为aArrayList<int[]>
所以我的循环应该是这样的
ArrayList<int[]> data = ... // load a dataset`
Map<Integer[], Double> frequencies = new HashMap<Integer[], Double>();
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<Integer> you = Arrays.stream( data ).boxed().collect( Collectors.toList() );
List<Integer> 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<Integer>
,无论是anArrayList
还是更好用Arrays.asList
。更好的是你可以引入一个代表数据的类(类似于java.awt.Rectangle
但我建议将变量设为私有,最后也是类最终)。