问题

我是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 赞)

据推测,你希望映射的键匹配元素的值而不是数组的标识。在这种情况下,你需要某种对象来定义你期望的equalshashCode。最简单的是转换为aList<Integer>,无论是anArrayList还是更好用Arrays.asList。更好的是你可以引入一个代表数据的类(类似于java.awt.Rectangle但我建议将变量设为私有,最后也是类最终)。


原文链接