面试官给了我一个问题,我需要将数组转换为列表,然后打印出相反的结果,我在 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

  • 只是提醒一下,像 for (int j = m.length-1 , j>=0;j–){list.add(m[j]); 或直接打印 Sysout (m[j]); 这样的答案是不允许的,因为根据他的说法,这是一种蛮力方法。


    – 


  • “我不知道我以后不能编辑它:(” – 使用编辑链接。您可以编辑您的评论…最多 5 分钟。


    – 


  • 4
    一个简单的 for 循环怎么会被认为是蛮力呢?Collections.reverse在底层可能也是一样。


    – 

  • 正如在本网站上看到的,Arrays.asList()只能处理引用数组(对象),而不能处理基元数组(例如,int[]如您的情况) – 如果您有Integer[]


    – 


  • 1
    替代方案:Arrays.stream(m).boxed().toList()——快速搜索结果已被标记为重复的


    – 



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 数组,intList元素的类型为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。但是,这是一个有区别的列表。它是数组的反向视图,因此请按以下步骤操作:

  1. 列表的get(n)方法应该返回array[array.length - 1 - n]

  2. 列表的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