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发现得很好。更新了我的答案。喜欢这个。在我稍微简单一点的答案中引用了它