java的java list集合排序迭代器

& 迭代器(Iterator)给我们提供了一种通用的方式来访问集合中的元素。Iterator在Java的帮助文档中我们可以知道,它提供了一个借口,并没有提供真正的Iterator类。Iterator是对collection 进行迭代的迭代器。在Java的Iterator借口中定义了三个方法:hasNext()如果仍有元素可以迭代,则返回true;next()返回迭代的下一个元素;remove()从迭代器指向的collection 中移除迭代器返回的最后一个元素(可选操作)。最后一个方法是可选的操作,但是我们知道在Java中借口必须实现所有的方法,那么这里是为什么呢?在Java中如果定义太多的借口的话,无形中会增加我们编程的难度。所以Java提供了对于方法的可选操作,也就是在继承该接口的类中可以实现该方法也可以不实现,如果不实现Java会抛出一个UnsupportedOperationException异常。&&&&我们可以认为迭代器Iterator是指向两个元素之间的位置,我们可以使用hasNext()来判断当前位置后面是否还有元素。使用next()方法返回后面的元素,并且将位置移动到下一个元素前的位置。对于remove方法我们删除的是当前位置前面的元素,所以我们在调用remove()方法之前必须先调用至少一次next()方法。这里所说的迭代器的位置在被迭代的对象中并不存在的,只是我们为了准确的说明这个方法,而假想出来的。&&&&在Java中并没有真正的实现Iterator,那么我们怎样创建一个Iterator对象呢?Collection的间接实现类都有一个方法iterator()方法,返回的就是一个Iterator对象,我们可以使用这个方法去创建对象。下面我们举例说明一下:&&&&&&&&&&& //two&&& Three&&& 在上面的程序中我们调用ArrayList的iterator方法返回一个Iterator迭代器,并用这个迭代器输出了结果。可能我们会想我们通过调用ArrayList类的size()方法得到元素的多少,用for循环照样可以输出,何必再去写这么一个接口呢。这样是为了我们可以使用通用的方法,去访问集合类中的元素。我们可以像类似下面的方法写一个迭代器通用输出方法:&&&&&& Public voiddisplay(Collection c){&&&&&&&&&&&& Iteratorit = c.iterator();&&&&&&&&&& While(c.hasNext())&&&&&&&&&&&&& System.out.println(c.next());&&&&&& }&&& 到这里我们对迭代器Iterator已经有了一个初步的认识了,下面我们介绍一下Collections类,看清楚最后有一个&s&,不要和接口Collection混了。&&& Collections类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即&包装器&,包装器返回由指定collection 支持的新 collection,以及少数其他内容。这个类主要是针对集合类进行的操作,在这个类中有好多的方法都是比较实用的。读者可以参照Java的帮助文档学习里面的方法,我们这里只是介绍一下其中的sort方法。&&&&&&&& 在Java中Collections.sort方法是一个重载的方法,下面我们先看第一个&Collections.sort(集合类的对象)。我们知道集合类中存储的都是对象,我们利用这个方法可以对我们传入的集合类按照自然排序进行排序。要求传入的对象必须实现了Comparable接口。&&&&&&&&& Comparable接口有一个方法compareTo(obj)。这个方法是用于两个对象的比较。使用的时候a.compareTo(b)这样写,如果a&b返回大于1的数值,如果a=b返回0,如果a&b返回大于0的值。在我们使用集合类的sort方法的时候,会自动按照这个方法进行比较而排序。下面我们看一个例子:&&&&&&&&&&&&&&&&&&&&&&&&&& //1&&&&&&&&&&&&&&&&&& 2&&&&&&&&&&&&&&&&&& 3&&&&&&&& 下面我们介绍sort方法的另一个重载方法,它需要两个参数分别是集合类和一个比较器。比较器是java.util包中的叫做Comparator,这是一个接口。我们要创建比较器需要实现这个接口。这个接口有两个方法compare和equalsTo方法。但是一般情况下我们只需要实现第一个,第二个可以不用实现。因为在Object类中已经实现了equalsTo方法,我们的类都默认继承了Object类,所以也都继承了equalsTo方法。&&&&&&&& omparator接口中compare方法的定义:int&compare(对象 o1,对象 o2),返回的是o1&o2?1(o1==o2?0:-1)。我们有时候会需要几种比较方法我们可以多创建几个比较器。然后调用Collections.sort方法传入我们需要排序的集合类和用到的比较器。我们传入的比较器的统统排序的结果也不同,这里我们就不用例子来详细介绍了,大家自己去写代码实践一下。&&& 本次就先到这里,希望对你有帮助。摘自:孟祥月的博客就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    Iterator iterator():迭代器,集合的专用遍历方式
  A:Object next():获取元素,并移动到下一个位置。
    有时候会出现这样的错误: NoSuchElementException:没有这样的元素,因为你已经找到最后了。
  B:boolean hasNext():如果仍有元素可以迭代,则返回 true。
  问题1:能用while循环写这个程序,我能不能用for循环呢?
    for(Iterator it = c.iterator();it.hasNext();){
        Student s = (Student) it.next();
        System.out.println(s.getName() + "---" + s.getAge());
  可以,并且for循环的效率高,因为这个循环用完后,it就被丢弃了,省内存。但是for循环语句不大明朗
  问题2:不要多次使用it.next()方法,
      因为每次使用都是访问一个对象。
迭代器的使用:
1 import java.util.ArrayL
2 import java.util.C
3 import java.util.I
4 public class IteratorDemo {
5 public static void main(String[] args) {
6 // 创建集合对象
7 Collection c = new ArrayList();
9 // 创建并添加元素
10 // String s = "hello";
11 // c.add(s);
12 c.add("hello");
13 c.add("world");
14 c.add("java");
16 // Iterator iterator():迭代器,集合的专用遍历方式
17 Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态
19 // Object obj = it.next();
20 // System.out.println(obj);
21 // System.out.println(it.next());
22 // System.out.println(it.next());
23 // System.out.println(it.next());
24 // System.out.println(it.next());
25 // 最后一个不应该写,所以,我们应该在每次获取前,如果有一个判断就好了
26 // 判断是否有下一个元素,有就获取,没有就不搭理它
28 // if (it.hasNext()) {
29 // System.out.println(it.next());
31 // if (it.hasNext()) {
32 // System.out.println(it.next());
34 // if (it.hasNext()) {
35 // System.out.println(it.next());
37 // if (it.hasNext()) {
38 // System.out.println(it.next());
40 // if (it.hasNext()) {
41 // System.out.println(it.next());
44 // 最终版代码
45 while (it.hasNext()) {
46 // System.out.println(it.next());
47 String s = (String) it.next();
48 System.out.println(s);
用迭代器来写重新写上个遍历
1 package zl_ObjectTest1;
3 import java.util.ArrayL
4 import java.util.C
5 import java.util.I
用集合存储5个动物对象,并把动物对象进行遍历,用迭代器遍历
11 public class AnimalDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建动物对象
Animal a1 = new Animal("猫", "虎纹",2);
Animal a2 = new Animal("荷兰猪", "粉色",1);
Animal a3 = new Animal("老鹰", "黑白",4);
Animal a4 = new Animal("鹦鹉", "五颜六色",2);
Animal a5 = new Animal("警犬", "黑色", 3);
//把对象放进去集合中
c.add(a1);
c.add(a2);
c.add(a3);
c.add(a4);
c.add(a5);
// Iterator iterator():迭代器,集合的专用遍历方式
Iterator it = c.iterator();
while (it.hasNext()){
//System.out.println(it.next());
//向下转型
Animal a = (Animal)it.next();
System.out.println(a.getName()+"\t"+a.getColor()+"\t"+a.getAge());
// NoSuchElementException 不要多次使用it.next()方法
// System.out.println(((Student) it.next()).getName() + "---"
// + ((Student) it.next()).getAge());
// 错误的用法
//((Student) it.next()).getName()拿的是第一个的名字,
//((Student) it.next()).getAge()拿的是第二个的年龄...
//改为for循环方法来遍历:
//for(Iterator it = c.iterator();it.hasNext();){
//Animal a = (Animal)it.next();
//System.out.println(a.getName()+"\t"+a.getColor()+"\t"+a.getAge());
阅读(...) 评论()JAVA基础(207)
今天说说集合的iterator迭代器与集合下标的使用先上代码import java.util.ArrayL
import java.util.I
public class Test {
public Test() {
// 初始化List
addItemToList();
private ArrayList&String& list = new ArrayList&String&();
private void addItemToList() {
for (int i = 0; i & 5; i++) {
list.add(i + &&);
public ArrayList&String& getList() {
public void setList(ArrayList&String& list) {
this.list =
public static void main(String[] args) {
Test test1 = new Test();
ArrayList&String& test1List = test1.getList();
for (int i = test1List.size() - 1; i &= 0; i--) {
System.out.println(i);
// 这里使用下标,直接指向元素
test1List.remove(i);
System.out.println(&test1List have been removed all elements&);
Test test2 = new Test();
ArrayList&String& test21List = test2.getList();
for (Iterator&String& iterator = test21List.iterator(); iterator.hasNext();) {
// 使用迭代器对集合操作时,需要先做next()
// next()类似于游标,他是介于两个元素之间的
// 不像上面直接指向某个元素
iterator.next();
iterator.remove();
System.out.println(&test2List have been removed all elements&);
输出:43210test1List have been removed all elementstest2List have been removed all elements注意点:1.使用迭代器对集合操作时,需要先做next()2.next()类似于游标,他是介于两个元素之间的,而下标,直接指向元素(详情看下图)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:593107次
积分:11038
积分:11038
排名:第1015名
原创:488篇
评论:242条
文章:50篇
阅读:115762
阅读:7902
文章:52篇
阅读:56199
文章:174篇
阅读:212257
阅读:1411
阅读:8209
文章:18篇
阅读:16820
阅读:7542
文章:31篇
阅读:24172
文章:152篇
阅读:148881
(7)(18)(28)(10)(46)(46)(49)(50)(49)(56)(92)(13)(3)(7)(14)(1)(1)(2)(2)(1)一、迭代器概述
  1、什么是迭代器?
  在Java中,有很多的数据容器,对于这些的操作有很多的共性。Java采用了迭代器来为各种容器提供了公共的操作接口。这样使得对容器的遍历操作与其具体的底层实现相隔离,达到解耦的效果。
  在Iterator接口中定义了三个方法:
  2、迭代器使用
public static void main(String[] args)
List&String& list=new ArrayList&&();
list.add("abc");
list.add("edf");
list.add("ghi");
for(Iterator&String& it=list.iterator();it.hasNext();)
System.out.println(it.next());
 执行结果: 
二、ArrayList的Iterator实现
   private class Itr implements Iterator&E&   {
// index of next element to return
int lastRet = -1; // index of l -1 if no such
int expectedModCount = modC
  在ArrayList内部定义了一个内部类Itr,该类实现了Iterator接口。
  在Itr中,有三个变量分别是
  cursor:表示下一个元素的索引位置
  lastRet:表示上一个元素的索引位置
  expectModCount:预期被修改的次数
  下面看一下Itr类实现了Iterator接口的三个方法:
public boolean hasNext()
return cursor !=//当cursor不等于size时,表示仍有索引元素
public E next() //返回下一个元素
checkForComodification();
if (i &= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementD
if (i &= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
  在next()方法中有一个checkForComodification()方法,其实现为:
final void checkForComodification()
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
  可以看到,该函数是用来判断集合的修改次数是否合法。
  在集合内部维护一个字段modCount用于记录集合被修改的次数,每当集合内部结构发生变化(add,remove,set)时,modCount+1。
  在迭代器内部也维护一个字段expectedModCount,同样记录当前集合修改的次数,初始化为集合的modCount值。当我们在调用Iterator进行遍历操作时,如果有其他线程修改list会出现modCount!=expectedModCount的情况,就会报并发修改异常java.util.ConcurrentModificationException。下面为示例代码:
public static void main(String[] args)
ArrayList&String& aList=new ArrayList&String&();
aList.add("bbc");
aList.add("abc");
aList.add("ysc");
aList.add("saa");
System.out.println("移除前:"+aList);
Iterator&String& it=aList.iterator();
while(it.hasNext())
if("abc".equals(it.next()))
aList.remove("abc");
System.out.println("移除后:"+aList);
  上面的代码中,如果我们只使用迭代器来进行删除,则不会出现并发修改异常错误。
  public static void main(String[] args)
    ArrayList&String& aList=new ArrayList&String&();
aList.add("bbc");
aList.add("abc");
aList.add("ysc");
aList.add("saa");
System.out.println("移除前:"+aList);
Iterator&String& it=aList.iterator();
while(it.hasNext())
if("abc".equals(it.next()))
it.remove();
System.out.println("移除后:"+aList);
public void remove()
if (lastRet & 0)
throw new IllegalStateException();
checkForComodification();
ArrayList.this.remove(lastRet);
cursor = lastR
lastRet = -1;
expectedModCount = modC
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
  在执行remove操作时,同样先执行checkForComodification(),然后会执行ArrayList的remove()方法,该方法会将modCount值加1,这里我们将expectedModCount=modCount,使之保持统一。
三、ListIterator
  上面可以看到,Iterator只提供了删除元素的方法remove,如果我们想要在遍历的时候添加元素怎么办?
  ListIterator接口继承了Iterator接口,它允许程序员按照任一方向遍历列表,迭代期间修改列表,并获得迭代器在列表中的当前位置。
  ListIterator接口定义了下面几个方法:
  下面使用ListIterator来对list进行边遍历边添加元素操作:
public static void main(String[] args)
ArrayList&String& aList = new ArrayList&String&();
aList.add("bbc");
aList.add("abc");
aList.add("ysc");
aList.add("saa");
System.out.println("移除前:" + aList);
ListIterator&String& listIt = aList.listIterator();
while (listIt.hasNext())
if ("abc".equals(listIt.next()))
listIt.add("haha");
System.out.println("移除后:" + aList);
阅读(...) 评论()

我要回帖

更多关于 java list集合 的文章

 

随机推荐