У меня есть класс Sorts, который сортирует (на основе сортировки вставкой, которая была направлением назначения) любой ArrayList любого типа, прошедшего через него, и использует сортировку вставки для лексикографической сортировки элементов в списке:
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);
}
}
}
В одном из моих других файлов я использую метод (который позже вызывается в main), который сортирует объекты типа Owner, и мы должны отсортировать их по фамилии (если они совпадают, то по имени):
Указания: "Сортировать список владельцев по фамилии от А до Z. Если несколько владельцев имеют одинаковую фамилию, сравните их имена. Этот метод вызывает метод сортировки, определенный в классе Сортировки."
Сначала я подумал о том, чтобы получить фамилию каждого владельца в цикле for, добавить ее во временный ArrayList типа string, вызвать 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, но яЯ не уверен, что мне понадобятся два ArrayList для этого, поскольку это кажется излишне сложным.
Так что вы думаете?
Редактировать: я добавляю версию CompareTo (Object other):
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;
}