Arraylist交换元素[重复]

Posted

技术标签:

【中文标题】Arraylist交换元素[重复]【英文标题】:Arraylist swap elements [duplicate] 【发布时间】:2013-04-04 12:28:28 【问题描述】:

如何交换ArrayList 的第一个和最后一个元素? 我知道如何交换数组的元素:设置一个临时值来存储第一个元素,让第一个元素等于最后一个元素,然后让最后一个元素等于存储的第一个元素。

int a = values[0];
int n = values.length;
values[0] = values[n-1];
values[n-1] = a;

那么对于ArrayList<String> 来说会是这样吗?

String a = words.get(0);
int n = words.size();
words.get(0) = words.get(n-1);
words.get(n-1) = a

【问题讨论】:

这个问题实际上是“我如何访问和更改List 的元素”? 这个问题比标记为重复的问题更有针对性。 我同意。改变数组列表是另一回事,交换 2 个节点是另一回事。 “Collections.swap”是正确答案,但无法通过重复标记的答案获得此答案; “如何在 java 中更改 ArrayList 元素的值”。应该修改重复的问题,或者删除重复的标记。 有趣的是,两个问题都有不同的接受答案,但它们仍然被标记为重复。在重复的问题中,询问如何更新一个值,而不是交换 2 个节点。这个问题绝对需要主持人注意。很遗憾,我的旗帜被无缘无故拒绝了。 链接的问题根本不是重复的。 “Collections.swap”——自 1.2 以来的 Java 的一部分——在链接问题的页面上找不到答案。因为这是一个不同的问题!如果@Raedwald 等人认为是这样,他们可以解释一下这是怎么回事?撤消重复状态! 【参考方案1】:

您可以使用Collections.swap(List<?> list, int i, int j);

【讨论】:

words.set(0, words.set(n-1, words.get(0))); @Evgeniy Dorofeev 使用 Collections.swap() 比使用 userList.remove(oldPosition)、userList.add(newPosition) 和 NotifyItemMoved(oldPosition, newPosition) 有优势吗? 【参考方案2】:

在Java中,你不能通过赋值来设置ArrayList中的值,有一个set()方法可以调用:

String a = words.get(0);
words.set(0, words.get(words.size() - 1));
words.set(words.size() - 1, a)

【讨论】:

【参考方案3】:

这样使用。这是代码的在线编译。看看http://ideone.com/MJJwtc

public static void swap(List list,
                        int i,
                        int j)

交换指定列表中指定位置的元素。 (如果指定的位置相等,则调用此方法会使列表保持不变。)

参数: list - 交换元素的列表。 i - 要交换的一个元素的索引。 j - 要交换的另一个元素的索引。

阅读官方收藏文档

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#swap%28java.util.List,%20int,%20int%29

import java.util.*;
import java.lang.*;

class Main 
    public static void main(String[] args) throws java.lang.Exception       
        
        //create an ArrayList object
        ArrayList words = new ArrayList();

        //Add elements to Arraylist
        words.add("A");
        words.add("B");
        words.add("C");
        words.add("D");
        words.add("E");

        System.out.println("Before swaping, ArrayList contains : " + words);

        /*
      To swap elements of Java ArrayList use,
      static void swap(List list, int firstElement, int secondElement)
      method of Collections class. Where firstElement is the index of first
      element to be swapped and secondElement is the index of the second element
      to be swapped.

      If the specified positions are equal, list remains unchanged.

      Please note that, this method can throw IndexOutOfBoundsException if
      any of the index values is not in range.        */

        Collections.swap(words, 0, words.size() - 1);

        System.out.println("After swaping, ArrayList contains : " + words);    

    

在线编译示例http://ideone.com/MJJwtc

【讨论】:

【参考方案4】:
for (int i = 0; i < list.size(); i++) 
        if (i < list.size() - 1) 
            if (list.get(i) > list.get(i + 1)) 
                int j = list.get(i);
                list.remove(i);
                list.add(i, list.get(i));
                list.remove(i + 1);
                list.add(j);
                i = -1;
            
        
    

【讨论】:

伙计!谢谢。我正在寻找一种不使用内置排序对 ArrayList 进行排序的方法。可能,我忽略了这样一个事实,即 ArrayList 的 add(index,object) 方法将对象添加到索引并右移已存在于该位置的对象(如果有的话)。 list.remove(i+1) 成功了! 请注意,我一开始使用了 remove() 然后 add() 方法,但出现了一些 IndexOutOfBounds 错误。 set 方法效果更好,至少对我来说是这样。

以上是关于Arraylist交换元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList

Java集合常用类特点整理

转 java集合常用类 介绍

将 ArrayList 转换为 Array - 不确定如何使用它 [重复]

java中ArrayList和LinkedList区别

Arraylis类