在以下方法中,我有一个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}}
答案 0 :(得分:4)
最简单的解决方案(适合初学者)
根据定义,ArrayList和List默认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);
}
}
其他选项
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
时也没有副作用。