【问题标题】:How to reverse an ArrayList without the reverse method?如何在没有 reverse 方法的情况下反转 ArrayList?
【发布时间】:2013-10-06 23:34:09
【问题描述】:

您好,我正在尝试在不使用 reverse 方法的情况下反转 ArrayList。我只是想让它在没有方法的情况下工作。我似乎无法正确处理。 这是我到目前为止所拥有的:

for (int x = nums.size()-1; x>=0; x--)
    {

        for(int z =0; z<nums.size();z++)
        {
            nums.set(z, x);

        }
    }

这是我的输出: 跑: 0 1 2 3

1 1 1 1 构建成功(总时间:0 秒)

【问题讨论】:

  • 你做了两次,然后重新排列回到原来的样子
  • @VirtualBaseClass - 实际上,他不是。如果他是,输出将是“0 1 2 3”而不是“1 1 1 1”。
  • @StephenC 是的.. 另一个问题是他正在设置值 x,而不是从数组中获取它。不知道为什么它是 1111,它不应该是 x 取的最后一个值,即 0。
  • @VirtualBaseClass - “不知道为什么它是 1111”。我建议你拿铅笔和纸,然后“手动执行”代码。那你就明白了。
  • @StephenC 真的不需要笔和纸,不过感谢您的评论。而且我仍然认为它是 0000。如果您指出我所缺少的,将不胜感激。

标签: java methods arraylist reverse


【解决方案1】:

您可以从底部上升并同时从顶部下降 (size() - 1) 交换元素,并在中途相遇时停止。

int i = 0;
int j = nums.size()-1;
while (i < j) {
    int temp = nums.get(i);
    nums.set( i, nums.get(j));
    nums.set( j, temp);
    i++; j--;
}

【讨论】:

  • 你介意把它放在一个for循环中吗?我想更好地理解它。
  • @JB - 您应该尝试以当前形式理解它。这种方式比for 循环更容易理解。
  • 由于有 两个 循环索引,您需要两个声明、两个初始化和两个改进。可以将语法放在“for”循环中(可能声明除外),但这会降低清晰度。
【解决方案2】:

您可以一次成对交换,从两端向中心进入:

for (int i = 0; i < nums.size()/2; i++) {
    Integer left = nums.get(i);
    Integer right = nums.get(nums.size()-1-i);
    nums.set(i, right);
    nums.set(nums.size()-1-i, left);
}

通过使用Integer 而不是int 来表示leftright,Java 不必在intInteger 值之间不断转换(第一个是原语,第二个是实物)。这可以提高性能。

【讨论】:

  • 你不知道这里有没有自动装箱
  • ArrayList 只能存储对象,因此在这种情况下,Integer 实例将被存储而不是 int。当您阅读docs.oracle.com/javase/7/docs/api/java/util/… 的文档时,您会注意到返回类型为E,在本例中指的是Integer。如果这个答案是int left = nums.get(i),那么返回的Integer 将被转换为int,然后存储在left 中。然后又会在nums.set(...中转换成Integer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2019-08-29
  • 2023-03-05
  • 2021-04-12
  • 2019-01-05
相关资源
最近更新 更多