现在这是我想回答的问题:编写一个以稀疏数组为参数并返回的方法一个新的等效密集数组。密集数组只需要足够大来容纳所有的值。例如,如果稀疏数组中最后一个元素的索引为89,则生成的密集数组只需要保存90个值。
dense array:[3,8,4,7,9,0,5,0]这个数字是随机生成的。稀疏阵列是数组的arraylist[[0, 3],[1, 8],[2、4],[3、7],[4,9],[6 5]]所以在稀疏数组中如果生成的数字是!0那么它的值和索引将被存储在大小为2的数组中但如果生成的数字是0则不存储
当集合中的元素(如数组)有固定大小时。你的解决方案很好,这是一个快速的方法。
但是当你的元素没有固定的大小时,比如:[[1,2,3],[4,5],[6],[7,8,9,10,11]]
,你可以通过你的元素:
for(int[] e : sparseArr)
{
for(int number : e)
{
tree.add(number);
}
}
无论你的sparseArr
中有多少个元素,你的元素有多长>
要对元素进行排序,我建议您使用TreeSet<E>
,元素推入树将自动排序。
所以如果你只想存储两个整数配对在一起,我建议使用HashMaps。在您的情况下,您将使用:
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
hashmap支持.containsKey(key);
和.containsValue(value);
如果要检查所有条目,可以将Map转换为entrySet:
for(Entry<Integer, Integer> e : map.entrySet()) {
int one = e.getKey();
int two = e.getValue();
}
除非你想做一些比仅仅存储2对整数更特殊的事情,我真的可以推荐这样做!
你需要的方法应该是这样的
public int[] sparseToDense (ArrayList<int[]> sparse) {
int i = 0;
int[] dense = new int[sparse.get(sparse.size()-1)[0]];
int[] sp;
ListIterator<int[]> iter = sparse.listIterator();
while (iter.hasNext()) {
sp = iter.next();
while (sp[0] != i) {
dense[i++] = 0;
}
dense[i++] = sp[1];
}
return dense;
}
这是另一种方法,因为您有java 8,您将能够使用流。但如果你是初学者,我建议你尝试for循环和数组,这对你的学习更有帮助。
public static ArrayList<Integer> returnDense(ArrayList<int[]> sparse) {
return sparse.stream().flatMap(p -> IntStream.of(p).boxed())
.collect(Collectors.toCollection(ArrayList::new));
}
如果您决定将int[]
更改为Integer[]
,
public ArrayList<Integer> returnDense(ArrayList<Integer[]> sparse) {
return sparse.stream().flatMap(p -> Arrays.asList(p).stream()).filter(Objects::nonNull)
.collect(Collectors.toCollection(ArrayList::new));
}
.filter(Objects::nonNull)
是要确保不会有空值,但如果你知道它不会有它,这是没有必要的。