繁体   English   中英

移动arraylist java中的元素

[英]moving elements in arraylist java

我有以下数组列表:

arrList = {"A", "2b", "3c", "4x", "5y", "6k", "7", "8", "9", "10", "11", "13", "14", "15", "16", "17", "18", "19", "20"}

我想移动元素,所以它变成:

arrList = {"A", "3c", "4x", "5y", "6k", "2b", "7", "8", "9", "10", "11", "13", "14", "15", "16", "12", "17", "18", "19", "20"}

请注意:第 2 位中的项目已移至第 6 位。 第 12 位已移至第 16 位

谁能告诉我如何使用 for 循环实现这一目标? 或者,还有更好的方法?

如果我的列表是动态的并且不断增长,我希望继续使用相同的模式,以便项目在:

第 22 位将移至第 26 位

就代码行而言,最简单的方法是从列表中删除元素并将其重新插入到新位置:

list.add(toPos, list.remove(fromPos));

然而,这不一定是最有效的方法,因为它需要数组列表中的所有元素通过删除向下移动,并通过插入向上移动。

您可以通过显式原位移动所有元素来更有效地完成此操作:

Integer fromValue = list.get(fromPos);
int delta = fromPos < toPos ? 1 : -1;
for (int i = fromPos; i != toPos; i += delta) {
  list.set(i, list.get(i + delta));
}
list.set(toPos, fromValue);

简单示例如何在不丢失数据的情况下将一个元素移动到另一个元素。

public void move(List myList, int fromPosition, int toPosition) {
        if (fromPosition < toPosition) {
            myList.add(toPosition, myList.get(fromPosition));
            myList.remove(fromPosition);
        } else {
            myList.add(toPosition, myList.get(fromPosition));
            myList.remove(fromPosition + 1);
        }
    }

对于: [A][B][C][D][E]


情况 1 :移动[A]->[B] fromPosition 0, toPosition 1,条件 where fromPosition < toPosition
第 1 步: [A][A*][B][C][D][A]移动到第二个位置(参数 toPosition)
第 2 步: [A*][B][C][D]删除旧的[A]位置(参数 fromPosition)


情况 2 : 移动[C]->[A] fromPosition 2, toPosition 0, 条件fromPosition >= toPosition
第 1 步: [C*][A][B][C][D][C] [C*][A][B][C][D]移动到第一个位置(参数 toPosition) - 我们向左移动,所以列表被拉伸(旧的 [C] 位置增加了 +1 )
第 2 步: [C*][A][B][D]删除旧的[C]位置(参数 fromPosition)

由于您基本上是将第二个元素移动到第 6 个位置等,您可以执行以下操作:

  • 删除第二个元素,从而将剩余的元素向左移动 1
  • 读取所需位置的元素

这可以在一行中完成: list.add( targetPos, list.remove( sourcePos ) )

当然,这仍然不如仅移动必须手动移动的部分那样有效,但您可能不想为此烦恼,除非您真的经常调用它或有大量列表。

而且,正如已经指出的那样,您必须确保sourcePos < targetPos

您的需求不是很清楚,但要在数组列表中移动元素,请使用Collections.swap(arrayList,2,6); 例如

您可以使用subListaddAll方法。

https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#subList-int-int- https://docs.oracle.com/javase/8/docs/api/ java/util/List.html#addAll-java.util.Collection-

例如

ArrayList myNewList = new ArrayList(); myNewList.addAll(sourceList.subList(2, 8)); myNewList.addAll(sourceList.subList(0, 1));

您可以这样做(完全考虑您的要求):

int shiftCount = 4;

if(arrList != null) {
    for (int i = 1; i < arrList.size(); i +=10) {
        if(arrList.size() < i+shiftCount+1) break;
        String tmpObj = arrList.get(i);
        arrList.remove(i);
        arrList.add(i+shiftCount, tmpObj);
    }
}

您的代码显示每个元素都应该向右移动 4 个块,我只是首先放置了最后 4 个元素,以便每个元素按照这里的要求移动 4 个位置是我的代码

    String  arrList[] = {"A", "2b", "3c", "4x", "5y", "6k", "7", "8", "9", "10", "11", "13", "14", "15", "16", "17", "18", "19", "20"}; 
     String part1[] = new String[arrList.length-4];
     System.arraycopy(arrList, 0, part1,0, arrList.length-4);
     //System.out.println(arrList.length);
     String part2[] = new String[4];       
      System.arraycopy(arrList, arrList.length-4, part2,0, 4);
      System.out.println();
      String[] result = Stream.concat(Arrays.stream(part2), Arrays.stream(part1))
              .toArray(String[]::new);
      System.out.println();
      for(int hj =0 ;hj<result.length;hj++)
      { 
        System.out.print(result[hj]+" ");  
      }

希望你发现我的代码有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM