面试官给了我一个问题,我需要将数组转换为列表,然后打印出相反的结果,我在 JAVA 17 中尝试了两种解决方案,你们能告诉我为什么会发生这些情况吗?除了使用蛮力方法,还有什么好的简单方法吗?
int m[] = {1,2,3,4,5,6,7,8};
试验 1 我尝试将数组转换为列表,然后反转使用集合
int m[] = {1,2,3,4,5,6,7,8};
List<Integer> tmp = Arrays.asList(m);
error :- Incompatible types. Found: java.util.List<int[]>, required: java.util.List<java.lang.Integer>
试验 2
int m[] = {1,2,3,4,5,6,7,8};
Collections.reverse(Arrays.asList(m));
for (int each : m)
System.out.print(" "+each);
这打印1 2 3 4 5 6 7 8
得很奇怪(我假设 Collections.reverse 正在工作,但它将反转列表存储在堆中的其他地方,而不是数组所在的位置,如果我错了,请纠正我)。
6
5 个回答
5
您的问题的答案:
您可以使用 Java 的 Stream 类将原始数组转换为 List:
List<Integer> list = Arrays.stream(m).boxed().collect(Collectors.toList());
然后你可以逆转它:
Collections.reverse(list);
并打印:
System.out.println(list);
解释你的尝试:
Arrays.asList(m)
正在返回一个List<int[]>
,并且您正尝试将其存储在一个List<Integer>
变量中。
这就是类型不匹配错误的来源。
Arrays.asList(m)
正在创建一个List
包含一个元素的列表m
,一个int[]
。您有一个包含原始数组的列表。
当您反转列表时,它只有一个项目,即数组,因此没有什么可反转的。但由于您没有将此列表分配给任何变量,因此它不复存在。
然后,循环将遍历原始列表,m
该列表未执行任何操作,因此按相同顺序打印出元素。
0
|
您正在声明一个 s 数组,int
而List
元素的类型为Integer
。
您可以通过声明 s 数组来解决这个问题Integer
:
Integer m[] = {1,2,3,4,5,6,7,8};
在您第二次试验中,Arrays.asList(m)
创建一个List
单个int[]
元素。
0
|
不使用列表的替代方法:创建一个与源数组长度相同的新目标数组,并以相反的顺序用源数组的元素填充新数组
public static void main(String[] args) {
int[] source = {1,2,3,4,5,6,7,8};
int[] target = new int[source.length];
Arrays.setAll(target, i -> source[source.length - 1 - i]);
System.out.println(Arrays.toString(target));
}
|
根据您的描述,特别是“需要将数组转换为列表”和“不使用蛮力”这两点,听起来您不应该反转数组本身(那将是蛮力),而是创建一个提供数组反向视图的列表。
List<Integer>
按照以下示例的工作原理创建一个实现的类Arrays.asList
。但是,这是一个有区别的列表。它是数组的反向视图,因此请按以下步骤操作:
-
列表的
get(n)
方法应该返回array[array.length - 1 - n]
。 -
列表的
iterator()
方法应该返回一个新的迭代器,该迭代器从 开始array[array.length]
并向下进行,在 处停止array[0]
。
|
我不太清楚你说的暴力破解是什么意思。你觉得幕后是怎么做的?我只想用这种简单的东西。
int m[] = {1,2,3,4,5,6,7,8};
List<Integer> list = new ArrayList<>();
for (int i : m) {
list.add(i);
}
System.out.println(list.reversed());
印刷
[8, 7, 6, 5, 4, 3, 2, 1]
要反转列表或数组,您可以对偶数或奇数长度数组执行如下操作。(请注意,您只需迭代一半的数组或列表)。
int m2[] = {1,2,3,4,5,6,7,8};
int idx = m2.length-1;
for (int i = 0; i < m2.length/2; i++) {
// swap end values going outside in
int k = m2[i];
m2[i] = m2[idx];
m2[idx--] = k;
}
System.out.println(Arrays.toString(m2));
印刷
[8, 7, 6, 5, 4, 3, 2, 1]
0
|
–
–
Collections.reverse
在底层可能也是一样。–
Arrays.asList()
只能处理引用数组(对象),而不能处理基元数组(例如,int[]
如您的情况) – 如果您有Integer[]
–
Arrays.stream(m).boxed().toList()
——快速搜索结果已被标记为重复的–
|