无法弄清楚如何从扩展类中对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可以排序吗?感谢
答案 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());