-2

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

这是我所拥有的:

通讯录类:

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      
   }
}

扩展地址簿类:

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;
    }

}

所有条目类:

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); 在 ExtendedAddressBook 类中。有人可以指出我哪里出错了,如果它甚至可以扩展一个类以便可以对 arrayList 进行排序?谢谢

4

4 回答 4

7

你有几个问题。首先,您创建了一个扩展 Entry 添加 Comparable 接口的 AllEntries 类,但是您实际上并没有创建任何 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 );
        }
    }
}
于 2013-04-25T15:19:44.617 回答
2

有两个版本Collections.sort

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

第二以集合和 aComparator作为参数,并根据 Comparator 对元素进行排序。这意味着对集合中元素的类型没有限制。

您可以采用这种方法编写自己的方法,Comparator<Entry>而不是修改现有的类,然后将其传递给 Collections.sort。既然这是一个任务,我就从这里交给你……

于 2013-04-25T15:18:56.993 回答
1

看来你不需要类AllEntries ..

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

于 2013-04-25T15:18:17.593 回答
0

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

public class EntryComparator implements Comparator<Entry>
{    
    public int compare(Entry o1, Entry o2) {
       //The compare code

    }
}

并使用以下方法调用 ExtendedAddressBook 中的方法:

Collections.sort(allEntries, new EntryComparator()); 
于 2013-04-26T12:01:48.443 回答