Java 是否将ArrayList元素移动到列表中的最后一个位置?

Java 是否将ArrayList元素移动到列表中的最后一个位置?,java,arraylist,Java,Arraylist,在下面的方法中,我有一个字符串的数组列表 我检查这些字符串是否在txt文件中(checkIfWordIsInTextFilemethod) 如果此列表中有一个字符串,我想将其放在列表的最后一个,然后返回重新排序的列表 我正在尝试使用set方法,但我不确定如何将字符串设置为列表中的最后一个元素 当前方法: public List<String> placeParentsLastInLineItemList(List<String> listToReorder){

在下面的方法中,我有一个
字符串的
数组列表

我检查这些字符串是否在txt文件中(
checkIfWordIsInTextFile
method)

如果此列表中有一个字符串,我想将其放在列表的最后一个,然后返回重新排序的列表

我正在尝试使用set方法,但我不确定如何将字符串设置为列表中的最后一个元素

当前方法:

 public List<String> placeParentsLastInLineItemList(List<String> listToReorder){

    for(String string: listToReorder){

       if(checkIfWordIsInTextFile(string)==true){
          listToReorder.set(,string); //how to set the string to the last element in list?
       }

    return listToReorder;
 }
public List placeParentsLastInLineItemList(List listToReorder){
for(字符串:ListToOrder){
如果(checkIfWordIsInTextFile(字符串)==true){
set(,string);//如何将字符串设置为列表中的最后一个元素?
}
将列表返回到订单;
}

使用新的
列表
实例作为结果:

public List<String> placeParentsLastInLineItemList(List<String> listToReorder) {
    List<String> inFileList = new ArrayList<>();
    List<String> notInFileList = new ArrayList<>();
    for (String string : listToReorder) {
        (checkIfWordIsInTextFile(string)? inFileList: notInFileList).add(string);
    }
    return joinLists(notInFileList, inFileList);
}

private List<String> joinLists(List<String> list1, List<String> list2) {
    List<String> result = new ArrayList<>(list1);
    result.addAll(list2);
    return result;
}
public List placeParentsLastInLineItemList(List listToReorder){
列表内嵌列表=新的ArrayList();
List notInFileList=新的ArrayList();
for(字符串:ListToOrder){
(checkIfWordIsInTextFile(字符串)?内嵌列表:notInFileList)。添加(字符串);
}
返回JoinList(非内嵌列表、内嵌列表);
}
私有列表JoinList(列表列表1、列表列表2){
列表结果=新的ArrayList(列表1);
结果:addAll(列表2);
返回结果;
}

此解决方案的优点是在修改输入参数时没有副作用。
listToReorder

最简单的解决方案(对于初学者)

根据定义,默认行为和默认行为会添加到列表的末尾。因此:-

listToReorder.add(string)
但是,您需要将其从原始位置移除,因此不要对每个循环使用索引,使用索引,然后在找到它时:-

listToReorder.remove(i);
…在将其重新添加到末尾之前,因此:-

for (int i=0; i<listToReorder.size(); i++){
  String item = listToReorder.get(i);

//NOTE: '==true' isn't required if the method returns a boolean
  if(checkIfWordIsInTextFile(item)){ 
//As per  @rishi007bansod suggestion: If we remove an item, then the next item will be shifted into this index & effectively skipped.  Therefore we want the index not to change this time around so decrement i after usage
    listToReorder.remove(i--);
    listToReorder.add(item);
  }
}

for(inti=0;i我要做的是使用迭代器,然后删除该项,并在末尾添加它们

List<String> toAdd = new ArrayList<>();
Iterator iter = listToReorder.iterator();
while(iter.hasNext()){
   String string = iter.next();
   if(checkIfWordIsInTextFile(string)){
       toAdd.add(string);
       iter.next();
   }
}

listToReorder.addAll(toAdd);
List toAdd=newarraylist();
迭代器iter=listToReorder.Iterator();
while(iter.hasNext()){
String=iter.next();
if(checkIfWordIsInTextFile(字符串)){
添加(字符串);
iter.next();
}
}
listToReorder.addAll(toAdd);

如前所述,您可以
删除列表中第一个出现的字符串,然后添加它,或创建一个新列表。但也可以对列表进行排序,以便文本文件中的所有单词最后出现:

listToReorder.sort((s1, s2) -> {
    if (checkIfWordIsInTextFile(s1))
        return 1;
    return -1;
});

只需删除它,然后再添加一个可能重复使用的迭代器,或者现在还没有安装java,所以我不能尝试发布解决方案。但是我有一个想法:为循环创建一个默认值(对于(int i=0;iSo i只是删除它并重新添加它,所有这些都在我原来的for循环中?创建一个完整的集合,只是将一个项目移动到现有集合的末尾?@Rossdew看不出有任何问题。但是使用
foreach
的解决方案比不使用它更清晰。没有真正的理由,不必进行初步优化。我sn不是优化,它只是很好的编码。创建集合的整个副本只是为了移动单个项目是浪费。简单的做法是删除一个元素并将其添加到末尾。这很复杂。事实上非常复杂,以至于您设法弄乱了逻辑。它不起作用。它生成一个字符串,只包含文件中的元素。仍然有效ed这是一个更简单的解决方案?@RossDrew这似乎是一个很好的答案,你能展示一下我是如何在索引for循环中完成这一切的吗?@Ross最简单的解决方案将失败,因为文本文件中存在列表中>=2个连续的元素。它将失败,因为列表在删除元素后会移动元素,我们在循环时总是增加索引。@rishi007bansod发现得很好。更新了我的答案。喜欢这个。在我稍微简单一点的答案中引用了它