2013-04-25 3 views
-2

не могу понять, как сортировать 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; 

    } 
} 

Когда я пытаюсь скомпилировать, я получаю «Не подходящий метод для сортировки (java.util.ArrayList) в следующей строке Collections.sort (allEntries); в классе ExtendedAddressBook. Может ли кто-нибудь указать мне, где я ошибаюсь, и если возможно даже расширить класс, чтобы отсортировать массив? Благодаря

+6

этот вопрос будет намного легче ответить, если вы включите [SSCCE] (http://www.sscce.org/) и более четкое и более цельное описание вашей проблемы. –

+0

Это домашнее задание? Если да, пожалуйста, отметьте как таковой. Посмотрите, какой тип вы сортируете. – km1

+0

@SamIam, если бы вы видели мой исходный код, вы увидите, что iv опущено более половины методов, которые эта программа содержит. Включены все методы, которые были необходимы, чтобы вывести его какую-то глупую ошибку, которую я сделал, что я не могу видеть – ToniHopkins

ответ

0

UPDATE - получил эту работу, заменив класс AllEntries с:

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

    } 
} 

И вызов метода в книге ExtendedAddressBook с использованием:

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

Кажется, вам не нужен класс AllEntries ..

отредактировано на основе комментариев: Поскольку Entry не может быть изменены, изменить Tha класс AllEntries в виде EntryComparator implements Comparator<Entry> и сделать сравнить() метод, используя в качестве базы метод compareTo(), который вы создали уже

+0

. Я должен упомянуть, что им не разрешено изменять код внутри AddressBook и Entry. Они были предоставлены для нас, и мы не можем их изменить, только расширяем. – ToniHopkins

+2

Итак, вам нужно создать компаратор и использовать метод Collections.sort – joaonlima

2

Существует две версии Collections.sort.

first one принимает только коллекцию в качестве аргумента и сортирует ее элементы в соответствии с их естественным заказом. То есть тип элемента должен реализовывать Comparable, и это метод compareTo этого класса, который используется для определения порядка упорядочения элементов.

second one берет коллекцию и Comparator в качестве аргумента и сортирует элементы в соответствии с компаратором. Это означает, что нет ограничений на тип элементов в коллекции.

Вы можете использовать этот подход, чтобы написать свой собственный Comparator<Entry> вместо изменения существующих классов, а затем передать это в Collections.sort. Поскольку это задание, я оставлю его отсюда ...

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); 
     } 
    } 
} 
+0

Итак, я могу счистить класс AllEntries и просто поместить вышеуказанный код в класс ExtendedAddressBook? Если это правильно, я попробовал, но получаю еще одну ошибку: java.util.Comparator - абстрактный; не может быть создан. Пробовал играть с кодом, но безрезультатно ... – ToniHopkins

+1

@ToniHopkins, Да, скраб класс AllEntries. Уверяю вас, что это работает, см. Приведенный выше полный пример (_which был скомпилирован и протестирован_). – Lucas

Смежные вопросы