2012-03-08 2 views
0

У меня есть класс Sorts, который сортирует (на основе сортировки вставки, которая была направлением назначения), любой ArrayList любого типа, прошедший через него, и использует вставки рода для сортировки элементов в списке лексикографически:Не знаете, как отсортировать ArrayList на основе частей объектов в этом ArrayList (Java)

public class Sorts 
{ 
public static void sort(ArrayList objects) 
{ 
    for (int i=1; i<objects.size(); i++) 
    { 
     Comparable key = (Comparable)objects.get(i); 
     int position = i; 

     while (position>0 && (((Comparable)objects.get(position)).compareTo(objects.get(position-1)) < 0)) 
     { 
      objects.set(position, objects.get(position-1)); 
      position--; 
     } 
     objects.set(position, key); 
    } 
} 
} 

в одном из моих других файлов, я использую метод (который вызывается в основной позже), которая сортирует объекты типа владельца, и мы должны сортировать их фамилия (если они совпадают, а затем имя):

Направления: «Отсортировать список владельцев по фамилии от А до Я. Если у более чем одного владельца есть тот же последний имя, сравнить их имена. Этот метод вызывает метод сортировки, определенный в классе Sorts. »

В первую очередь я хотел получить фамилию каждого владельца в цикле for, добавить его во временный ArrayList строки типа, вызвать Sorts.sort (), а затем повторно добавить его обратно в ArrayList ownerList:

public void sortOwners() { 
    ArrayList<String> temp = new ArrayList<String>(); 
    for (int i=0; i<ownerList.size(); i++) 
     temp.add(((Owner)ownerList.get(i)).getLastName()); 
    Sorts.sort(temp); 
    for (int i=0; i<temp.size(); i++) 
     ownerList.get(i).setLastName(temp.get(i)); 
} 

Я предполагаю, что это был неправильный способ приблизиться к нему, так как он не сортировки, когда я компилирую

Что я теперь думаю я. нужно создать два массива ArrayLists (один из них firstName, один - LastName) и сказать, что в цикле for, если (lastName одинаково), сравните firstName, но я не уверен, Для этого нужно два ArrayLists, поскольку это кажется излишне сложным.

Как вы думаете?

Edit: Я добавляю версию CompareTo (Object другой):

public int compareTo(Object other) 
{ 
    int result = 0; 
    if (lastName.compareTo(((Owner)other).getLastName()) < 0) 
     result = -1; 
    else if (lastName.compareTo(((Owner)other).getLastName()) > 0) 
     result = 1; 
    else if (lastName.equals(((Owner)other).getLastName())) 
    { 
     if (firstName.compareTo(((Owner)other).getFirstName()) < 0) 
      result = -1; 
     else if (firstName.compareTo(((Owner)other).getFirstName()) > 0) 
      result = 1; 
     else if (firstName.equals(((Owner)other).getFirstName())) 
      result = 0; 
    } 
    return result; 
} 

ответ

0

Если у вас есть контроль над Owner кодом, чтобы начать с, а затем изменить код так, что он реализует Comparable. Его метод compareTo() выполняет тест lastName/firstName, описанный в задании. Ваш метод sortOwners() передает List<Owner> непосредственно на номер Sorts.sort().

Если у вас нет контроля над Owner, тогда создайте подкласс Owner, который реализует Comparable. Назовите это OwnerSortable или тому подобное. Он принимает обычный объект Owner в своем конструкторе и просто делегирует все методы, отличные от compareTo(), к обернутому объекту. Его compareTo() будет функционировать, как указано выше. Ваш метод sortOwners() создаст новый List<OwnerSortable> из списка Owner. Затем он может передать это Sorts.sort().

+0

У меня уже есть Владелец, реализующий Comparable, и у него есть метод compareTo (Object other) внутри него, и он сравнивает lastName и firstName. Итак, как бы применить это в sortOwners()? –

+0

Затем вы должны быть установлены - просто передайте 'ArrayList ' '' Sorts.sort() '. –

+0

Это то, что я делаю, и я до сих пор разбираю некоторые вещи, а некоторые нет. –

1

Я думаю, что объект должен реализовать метод compareTo, который следует за нормальным договором Comparable - ищите сортировку по нескольким полям. Вы правы, что наличие двух списков не нужно.

0

Поскольку это домашнее задание, вот несколько советов:

  1. Если предположить, что цель состоит в том, чтобы осуществить своего рода алгоритму себя, вы обнаружите, что это намного проще (и более производительный) для извлечения элементов списка в массив, отсортировать массив и затем перестроить список (или создать новый).

  2. Если это не цель, то посмотрите на класс Collections.

  3. Внесите заказ Comparator или измените класс объекта для реализации Comparable.

+0

У меня уже есть реализация Comparable. И у Owner.java есть метод compareTo (Object other) внутри него, и он сравнивает lastName и firstName. Итак, как бы применить это в sortOwners()? –

+0

Если у вас есть Компаратор и/или ваш класс реализует Comparable, почему вы извлекаете и сортируете имена владельцев? Вы читали мой второй намек? –

0

Поскольку у вас есть ArrayList объектов, обычно мы будем использовать метод Collections.sort() для выполнения этой задачи. Обратите внимание на подпись метода:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

Что важно здесь то, что все объекты сортируются должен реализовывать интерфейс Comparable, который позволяет объектам можно сравнить с другим в численной форме. Чтобы уточнить, Comparable объект имеет метод, называемый compareTo со следующей подписью:

int compareTo(T o)

Теперь мы получаем к хорошей части. Когда объект равен Comparable, его можно сравнить численно с другим объектом. Давайте посмотрим на образец вызова.

String a = "bananas"; 
String b = "zebras"; 
System.out.println(a.compareTo(b)); 

Результат будет -24. Семантический, так как зебр дальше в задней части словаря по сравнению с бананов, мы говорим, что бананов сравнительно менее чем зебры (не так далеко, в словаре).

Итак, решение должно быть понятным. Используйте compareTo, чтобы сравнить ваши объекты таким образом, чтобы они сортировались в алфавитном порядке. Поскольку я показал вам, как сравнивать строки, вы должны, надеюсь, иметь общее представление о том, что нужно написать.

После того, как вы провели численное сопоставление, вы должны использовать класс Collections для сортировки вашего списка. Но поскольку у вас есть собственная способность сортировки, отсутствие доступа к ней не является большой потерей. Вы все еще можете сравнить численно, что было целью! Таким образом, это должно сделать необходимые шаги более ясными, теперь, когда я их выложил.

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