现在我想回答这个问题: 编写一个方法,将稀疏数组作为参数并返回 一个新的等效密集数组。密集数组只需要足够大以适应所有值。例如,如果稀疏数组中的最后一个元素位于索引89,则生成的密集数组只需要保存90个值。
密集阵列:[3,8,4,7,9,0,5,0]该数字是随机生成的。 稀疏数组是数组[[0,3],[1,8],[2,4],[3,7],[4,9],[6,5]]的一个列表 所以在稀疏数组中,如果生成的数字是!0,则该值及其索引存储在大小为2的数组中,但如果生成的数字为0,则不存储任何内容
答案 0 :(得分:2)
当您的集合中的元素(作为数组)具有固定大小时。你的解决方案没问题,这是一种快速的方式。
但是当你的元素没有固定大小时,例如:[[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>
,元素推入树将自动排序。
答案 1 :(得分:0)
因此,如果您只想存储2个整数配对,我建议使用HashMaps。在您的情况下,您将使用:
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
HashMaps支持.containsKey(key);
以及.containsValue(value);
如果要检查所有条目,可以将Map转换为entrySet:
for(Entry<Integer, Integer> e : map.entrySet()) {
int one = e.getKey();
int two = e.getValue();
}
除非你想做一些比存储2个配对整数更特殊的东西,否则我真的可以这样做!
答案 2 :(得分:0)
你所追求的方法应该做这样的事情
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;
}
答案 3 :(得分:0)
只是另一种方法,因为你有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)
是确保不会有空值,但如果你知道不会有空值,那就没有必要了。