如何在Java中将int 转换为Integer ?

我是新来的Java和非常困惑。

我有一个长度为4 int[]的大型数据集,我想要统计每个特定的4个整数组合出现的次数。 这与计算文档中的单词频率非常相似。

我想要创build一个Map<int[], double> ,当迭代列表时,将每个int []映射到正在运行的计数,但Map不采用基元types。

所以我做了Map<Integer[], Double>

我的数据存储为一个ArrayList<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[] 。 或者,也许我从根本上困惑正确的方式来做到这一点。

原生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[]通常不是一个好的地图关键。 但就转换而言,我们现在有一个相对干净的本地代码。

如果要将int[]转换为Integer[] ,那么在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的lang库,那么你可以像这样使用ArrayUtils.toObject(int[])方法:

 Integer[] newArray = ArrayUtils.toObject(oldArray); 

大概你想要的地图的关键匹配元素的值,而不是数组的身份。 在这种情况下,你需要一些定义equalshashCode的对象。 最简单的就是转换成一个List<Integer> ,或者是一个ArrayList或者更好的使用Arrays.asList 。 比你更好的介绍一个代表数据的类(类似于java.awt.Rectangle但是我build议把variables私有化,最后也是类)。

我以前的回答错了。 正确的解决scheme是使用这个类作为封装实际的int []的映射关键。

 public class IntArrayWrapper { int[] data; public IntArrayWrapper(int[] data) { this.data = data; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; IntArrayWrapper that = (IntArrayWrapper) o; if (!Arrays.equals(data, that.data)) return false; return true; } @Override public int hashCode() { return data != null ? Arrays.hashCode(data) : 0; } } 

并像这样改变你的代码:

  Map<IntArrayWrapper, Double > freqs = new HashMap<IntArrayWrapper, Double>(); for (int[] data : datas) { IntArrayWrapper wrapper = new IntArrayWrapper(data); if ( freqs.containsKey(wrapper)) { freqs.put(wrapper, freqs.get(wrapper) + p); } freqs.put(wrapper, p); } 

使用没有外部库的常规for循环:

将int []转换为Integer []:

 int[] primitiveArray = {1, 2, 3, 4, 5}; Integer[] objectArray = new Integer[primitiveArray.length]; for(int ctr = 0; ctr < primitiveArray.length; ctr++) { objectArray[ctr] = Integer.valueOf(primitiveArray[ctr]); // returns Integer value } 

将Integer []转换为int []:

 Integer[] objectArray = {1, 2, 3, 4, 5}; int[] primitiveArray = new int[objectArray.length]; for(int ctr = 0; ctr < objectArray.length; ctr++) { primitiveArray[ctr] = objectArray[ctr].intValue(); // returns int value } 
  1. 将int []转换为Integer []

     public static Integer[] toConvertInteger(int[] ids) { Integer[] newArray = new Integer[ids.length]; for (int i = 0; i < ids.length; i++) { newArray[i] = Integer.valueOf(ids[i]); } return newArray; } 
  2. 将Integer []转换为int []

     public static int[] toint(Integer[] WrapperArray) { int[] newArray = new int[WrapperArray.length]; for (int i = 0; i < WrapperArray.length; i++) { newArray[i] = WrapperArray[i].intValue(); } return newArray; } 

而不是编写自己的代码,你可以使用IntBuffer来包装现有的int [],而不必将数据复制到一个Integer数组中

 int[] a = {1,2,3,4}; IntBuffer b = IntBuffer.wrap(a); 

IntBuffer实现可比,所以你可以使用你已经写的代码。 正式映射比较键,使得a.equals(b)被用来说明两个键是相等的,所以两个具有数组1,2,3的IntBuffers – 即使数组在不同的存储位置 – 被认为是相等的,所以将为您的频率代码工作。

 ArrayList<int[]> data = ... // load a dataset` Map<IntBuffer, Double> frequencies = new HashMap<IntBuffer, Double>(); for(int[] a : data) { IntBuffer q = IntBuffer.wrap(a); if(frequencies.containsKey(q)) { frequencies.put(q, tfs.get(q) + p); } else { frequencies.put(q, p); } 

}

希望有所帮助

不知道为什么你需要在你的地图双。 根据你想要做什么,你有一个int [],你只是想要每个序列发生多less次? 为什么这需要一个双?

我要做的是用适当的.equals和.hashCode方法为int数组创build一个包装,以说明int []对象本身不考虑这些方法的版本中的数据。

 public class IntArrayWrapper { private int values[]; public IntArrayWrapper(int[] values) { super(); this.values = values; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(values); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; IntArrayWrapper other = (IntArrayWrapper) obj; if (!Arrays.equals(values, other.values)) return false; return true; } } 

然后使用谷歌番石榴的multiset,这意味着计数发生的目的,只要你放在它的元素types有正确的.equals和.hashCode方法。

 List<int[]> list = ...; HashMultiset<IntArrayWrapper> multiset = HashMultiset.create(); for (int values[] : list) { multiset.add(new IntArrayWrapper(values)); } 

然后,为了得到任何特定组合的计数:

 int cnt = multiset.count(new IntArrayWrapper(new int[] { 0, 1, 2, 3 })); 

更新:虽然下面编译,它会在运行时抛出一个ArrayStoreException 。 太糟糕了。 我会让它留下供将来参考。


int[]转换为Integer[]

 int[] old; ... Integer[] arr = new Integer[old.length]; System.arraycopy(old, 0, arr, 0, old.length); 

我必须承认,由于System.arraycopy是低级别的,而且一切都是这样的,所以我感到有些惊讶。 至less在java7中。

您可以轻松地转换其他方式。

这工作就像一个魅力!

 int[] mInt = new int[10]; Integer[] mInteger = new Integer[mInt.length]; List<Integer> wrapper = new AbstractList<Integer>() { @Override public int size() { return mInt.length; } @Override public Integer get(int i) { return mInt[i]; } }; wrapper.toArray(mInteger); 

你不需要。 int[]是一个对象,可以在地图中用作键。

 Map<int[], Double> frequencies = new HashMap<int[], Double>(); 

是频率图的正确定义。

这是错的:-)。 正确的解决scheme也张贴:-)。

只需使用:

 public static int[] intArrayToIntegerArray(Integer[] array) { int[] g = new int[array.length]; for(int i = 0; i < array.length; i++){ g[i] = array[i]; } return g; }