如何在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);
大概你想要的地图的关键匹配元素的值,而不是数组的身份。 在这种情况下,你需要一些定义equals
和hashCode
的对象。 最简单的就是转换成一个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 }
-
将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; }
-
将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; }