将ArrayList元素移动到List中的最后一个位置?

时间:2016-10-07 14:07:56

标签: java arraylist

在以下方法中,我有一个Strings checkIfWordIsInTextFile

我检查这些字符串是否在txt文件中( 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; } 方法)。

如果字符串在此列表中,我想在列表中放置最后,然后返回重新排序的列表。

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

当前方法:

{{1}}

4 个答案:

答案 0 :(得分:4)

最简单的解决方案(适合初学者)

根据定义,ArrayListList默认add()行为会添加到列表的末尾。所以: -

listToReorder.add(string)

您需要将其从原始位置移除,因此不要使用for-each循环,使用索引,然后当您找到它时: -

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)){ 
    listToReorder.remove(i);
    listToReorder.add(item);
  }
}

其他选项

  • 根据@Andriy Kryvtsuns的回答,您可以创建一个新的临时列表并按照您想要的顺序重新创建列表,但这会产生复杂的代码。另一个问题是你不知道传递了List的实现,如果传递LinkedList和{{1},那么创建一个完整列表可能效率低下可以比线性时间更快地运行。

更多高级选项

  • 您可以使用for-each循环(例如@Ash French),但您需要使用remove() - 每个循环限制您编辑正在循环的集合< / p>

  • 你可以获得所有Java 8并使用lambda,根据@Mad Matts优雅解决方案

答案 1 :(得分:1)

我会做的是使用迭代器,然后删除项目,然后在最后添加它们。

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);

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

结果使用新的List实例:

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;
}

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