创建并组装一个List,然后再创建第二个具有相同尺寸的List,将第一个List列表反序插入第二个列表中

基本思路:用listIterator(n)指向列表索引为n元素的特性,将ListIterator指向list1的末尾,依次加入到list2中。即反向读取list1,将读取的每一个元素顺序插入list2.

package p409;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;


public class TwoList {
	int length;
	List<Integer> list1  = new ArrayList<Integer>(length);
	List<Integer>list2 = new ArrayList<Integer>(length);
	ListIterator<Integer> li;
	//构造函数,给list1赋值,并且将li指向list1的最末尾的一个元素。
	TwoList(int length){
		this.length=length;
		for(int i=1;i<length;i++){
			list1.add(i);
		}
		li= list1.listIterator(length-1);//List序号是从零开始计数的,所以最末尾的元素为length-1
	}
	//对list2 进行初始化
	void list2(){
		while(li.hasPrevious()){//当ListIterator li 前面具有元素时,将当前的元素赋值给list2,并且向前移动(即li.previous的功能)
			list2.add(li.previous());
		
		}
	}
	//分别输出list1,list2
	void out1(){
		System.out.println(list1);
	}
	void out2(){
		System.out.println(list2);
	}
	static class Test{
		public static void main(String[] args) {
			TwoList tw=new TwoList(10);
			tw.list2();
			tw.out1();
			tw.out2();
		}
	}

}


网上查询到其他解决办法,其中通过

while(li.hasnext()){

li1.next();

}将li指向list1的末尾,并且对于list2列表的操作也使用了ListIterator(对于后者,我觉得没有必要,此题中对list2本身就应该是一个空的list,对于它的操作仅仅是通过add()方法就可以了,没必要再创建一个listIterator)。

感想:

最初想通过直接对list进行操作,发现并不可行,list列表只有add(),get()等方法,事实上是很难做到对其进行类似指针移动的操作,所以日后对于每一个需要操作的list数组进行一些操作,可能都需要用到ListIterator,或者简单的Iterator。在这里也不难理解为什么在这道题中的其它解决方法里,有人会对list2也使用一个listIterator,毕竟对list2也要进行一些操作(尽管这里只需要添加元素就好了)。在编写代码的时候,我总是会想直接把ListIterator直接赋值给List列表,类似于list1=li。事实上,这样是行不通的,List列表和迭代器ListIterator之间的关系不存在继承,仅仅是迭代器ListIterator 对Collection进行操作而已。实现赋值则是使用List的add()方法,调用迭代器Iterator的next()方法,传入list。(本题中使用的是list2.add(li.previous());)

此外,listIterator比iterator更为强大,它可以实现双向移动,也可以直接指向某个具体的元素,而iterator则只能单向移动。

最后:思考良久,决定还是不将我的博客设置为私密好了,有人能看必定是好事,发现其中错误更是可喜可贺,本人也是大三学生一枚,想记录一些自己学习过程中的问题,解决方法等,同时也想着,或许能被大神看到?对我一些遗漏之类的进行补充?那自然也能学习到不少

猜你喜欢

转载自blog.csdn.net/qq_41791653/article/details/80004740