无法扩展类并对ArrayList进行排序

时间:2013-04-25 15:12:24

标签: java arraylist

无法弄清楚如何从扩展类中对arrayList进行排序......

继承我所拥有的:

AddressBook类:

import java.util.ArrayList;
import java.util.Iterator;

public class AddressBook
{
  private ArrayList<Entry> data;

  public AddressBook()
  {
    this.data = new ArrayList();
  }

  public String add(Entry paramEntry)
  {
    //Some code      }

   public ArrayList<Entry> getAddressBook()
  {
    return this.data;
  }

  public String getAll()
  {
    //Some code      
   }
}

ExtendedAddressBook类:

import java.util.*;
import java.lang.Comparable;

public class ExtendedAddressBook extends AddressBook
{

   public ExtendedAddressBook()
    {

    }

    public String getAll()
    {
        String listAll = "Address Book\n";

        ArrayList<Entry> allEntries = getAddressBook();

        Collections.sort(allEntries);

        for ( Entry entry : allEntries )
        {

                ListAll = ListAll + entry.toString();

        }
        return ListAll;
    }

}

AllEntries类:

import java.lang.Comparable;

public class AllEntries extends Entry implements Comparable<Entry> 
{

    public int compareTo(Entry otherEntry) 
    {
        int d = this.getFirstName().compareTo(otherEntry.getFirstName());
        if (d == 0)
        {
           d =  this.getLastName().compareTo(otherEntry.getLastName()); 
         }
        return d;

    }
}

当我尝试编译时,我在以下行Collections.sort(allEntries)上找到'找不到合适的排序方法(java.util.ArrayList);在ExtendedAddressBook类中。有人能指出我哪里出错了,如果它甚至可以扩展一个类,那么arrayList可以排序吗?感谢

4 个答案:

答案 0 :(得分:7)

你有几个问题。首先,创建一个AllEntries类,扩展Entry添加Comparable接口,但实际上并不创建任何AllEntries对象。但无论如何你不应该这样做。相反,你应该这样做:

Collections.sort(allEntries, new Comparator<Entry>() {
    public int compare(Entry o1, Entry o2) {
        return o1.getFirstName().compareTo( o2.getFirstName() );
    }
});

----完整示例----

package com.example;


import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;
import java.util.List;


public class SortExample {
    private static class Entry {
        private String firstName;
        private String lastName;

        public Entry( String firstName, String lastName ) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public String toString() {
            return firstName + " " + lastName;
        }
    }

    public static void main( String[] args ) {
        List<Entry> list = new ArrayList<Entry>();
        list.add( new Entry( "Homer", "Simpson" ) );
        list.add( new Entry( "George", "Jettson" ) );
        list.add( new Entry( "Fred", "Flinstone" )  );
        list.add( new Entry( "Fred", "Durst" ) );

        Collections.sort( list, new Comparator<Entry>() {
            public int compare( Entry o1, Entry o2 ) {
                int compareValue = o1.getFirstName().compareTo( o2.getFirstName() );
                if ( compareValue == 0 ) {
                    compareValue = o1.getLastName().compareTo( o2.getLastName() );
                }
                return compareValue;
            }
        } );

        for ( Entry entry : list ) {
            System.out.println( entry );
        }
    }
}

答案 1 :(得分:2)

Collections.sort有两种版本。

first one仅将一个集合作为参数,并根据其自然排序对其元素进行排序。也就是说,元素类型必须实现Comparable,并且此类的compareTo方法用于确定元素的排序方式。

second one采用集合和Comparator作为参数,并根据比较器对元素进行排序。这意味着对集合中元素的类型没有限制。

您可以使用此方法编写自己的Comparator<Entry>,而不是修改现有的类,然后将其传递给Collections.sort。由于这是一项任务,我将从这里留给你......

答案 2 :(得分:1)

您似乎不需要班级 AllEntries ..

根据评论编辑: 由于无法修改Entry,因此请将类AllEntries更改为EntryComparator implements Comparator<Entry>并执行 compare()方法,并使用您已创建的compareTo()方法作为基础

答案 3 :(得分:0)

更新 - 通过将AllEntries类替换为:

来实现此目的
public class EntryComparator implements Comparator<Entry>
{    
    public int compare(Entry o1, Entry o2) {
       //The compare code

    }
}

使用以下方法在ExtendedAddressBook中调用方法:

Collections.sort(allEntries, new EntryComparator());