Java лучший способ сортировки списка другим списком с другими объектами - PullRequest
0 голосов
/ 30 августа 2018

Допустим, у меня есть список с объектами, давайте назовем его listA, который неупорядочен, и у него есть объекты типа A. Тип A имеет поле с именем name. теперь у меня есть другой список, который заказан. давайте назовем это listB и оно будет заказано. объекты в этом списке имеют тип B, и у них также есть поле name.

Теперь я хочу, чтобы listA был упорядочен как listB, и единственное, что одинаково в этих двух списках, это поле name, которое одинаково в обоих объектах.

Какой самый эффективный способ сделать это?

1 Ответ

0 голосов
/ 30 августа 2018

Надеюсь, я понимаю вашу проблему.

Является ли поле «имя» общим полем для двух типов объектов (A и B)? Другими словами, два типа (A и B) расширяют один и тот же класс C, который содержит поле «имя»? Если это так, вы можете реализовать Comparable в классе C, а затем Collections.sort () подойдет вам. Все, что вам нужно сделать, реализуя сопоставимое, - это научить его сравнивать поле «имя» так, чтобы оно упорядочивало, таким же образом, упорядочивает список объектов типа B, который вы укажете.

Еще один способ сделать это , если ваши классы не имеют ничего общего, а следовательно, не имеют смысла иметь суперкласс C, это создать интерфейс Comparator, где вы можете указать поля, которые можно использовать для сравнения двух разных объектов, а затем выполнить сортировку с использованием этих полей, другими словами:

  1. Создание интерфейса с методом getCompareFields () возвращает String []; (например)
  2. Реализация интерфейса пункта 1. в объектах A и B
  3. Реализовать алгоритм сортировки, который использует метод getCompareFields () этого интерфейса для сортировки.

И, иным способом, для вас, чтобы сделать это, но, на мой взгляд, было бы более сложным, было бы использовать отражение, чтобы получить поле 'name' обоих объектов, на случай, если они не имеют никакого отношения.

Надеюсь, это вам поможет.

EDIT Пример отражения:

Класс TypeA (Пример)

public class TypeA {
private String name;
private String id;

public TypeA() {
    this(null, null);
}

public TypeA(String name, String id) {
    this.name = name;
    this.id = id;
}

public String getName() {
    return this.name;
}

public String getId() {
    return this.id;
}

@Override
public String toString() {
    return "(" + name + ", " + id + ")";
}

}

Класс TypeB (Пример)

public class TypeB {
private String name;
private List<Integer> numbers;

public TypeB() {
    this(null);
}

public TypeB(String name, int ... numbers) {
    this.name = name;

    this.numbers = new LinkedList<Integer>();
    if (numbers != null) {
        for (int i : numbers) {
            this.numbers.add(i);
        }
    }
}

public String getName() {
    return this.name;
}

public List<Integer> getANumber() {
    return this.numbers;
}

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("(").append(name).append(", [");

    Iterator<Integer> i = this.numbers.iterator();

    if (i.hasNext()) {
        builder.append(i.next());

        while (i.hasNext()) {
            builder.append(", ").append(i.next());
        }
    }

    builder.append("])");
    return builder.toString();
}

}

Компаратор имени отражения:

public class NameReflectionComparator implements Comparator<Object> {

@Override
public int compare(Object o1, Object o2) {
    if (o1 != null && o2 != null) {
        try {
            Method obj1_getNameMethod = o1.getClass().getMethod("getName");
            Method obj2_getNameMethod = o2.getClass().getMethod("getName");

            String obj1_name = (String) obj1_getNameMethod.invoke(o1);
            String obj2_name = (String) obj2_getNameMethod.invoke(o2);

            if (obj1_name != null) {
                return obj1_name.compareTo(obj2_name);
            } else if (obj2_name != null) {
                return obj2_name.compareTo(obj1_name);
            }
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            e.printStackTrace();
        }

    } else if (o1 != null && o2 == null) {
        return 1;
    } else if (o1 == null && o2 != null) {
        return -1;
    }

    return 0;
}

}

Main:

public class Main {
public static void main(String[] args) {

    // both TypeA and TypeB have field name and method getName()
    // unsorted list
    List<TypeA> typeAList = new LinkedList<TypeA>();
    typeAList.add(new TypeA("Yves Larock", UUID.randomUUID().toString()));
    typeAList.add(new TypeA("I'm ok", UUID.randomUUID().toString()));
    typeAList.add(new TypeA("Aaah", UUID.randomUUID().toString()));
    typeAList.add(new TypeA("Noooh", UUID.randomUUID().toString()));

    // sorted list
    List<TypeB> typeBList = new LinkedList<TypeB>();
    typeBList.add(new TypeB("Aaah", 1, 2, 3));
    typeBList.add(new TypeB("I'm ok", 1));
    typeBList.add(new TypeB("Noooh", 34, 3));
    typeBList.add(new TypeB("Yves Larock", 4, 5, 3, 9));

    System.out.println("ListA:\n" + typeAList);
    System.out.println("ListB:\n" + typeBList);

    NameReflectionComparator comparator = new NameReflectionComparator();
    Collections.sort(typeAList, comparator);


    System.out.println("=== AFTER SORT ====\nListA:\n" + typeAList);
    System.out.println("ListB:\n" + typeBList);
}

} * * тысяча пятьдесят-один

Результат:

lišta: [(Ив Ларок, f40cb523-58e8-4ee2-aa4f-991ce7e7cdd5), (я в порядке, 5a66b9d9-7a27-4529-ab64-c893291bd9b0), (Aaah, 4842fd55-47e5-48ac-b7b6-eobc7) 8dc89675-bc28-4374-aff2-0c5d0ae6dd9d)] * ​​1055 *

LISTB: [(А-а-а, [1, 2, 3]), (я в порядке, 1 ), (Нееет, [34, 3]), (Ив Ларок, [4, 5, 3, 9 ])]

=== ПОСЛЕ СОРТИРОВКИ ==== lišta: [(Aaah, 4842fd55-47e5-48ac-b7b6-ebc7acf7023c), (я в порядке, 5a66b9d9-7a27-4529-ab64-c893291bd9b0), (Noooh, 8dc89675-bc28-4374-aff2-0c9d0, Yves6) f40cb523-58e8-4ee2-aa4f-991ce7e7cdd5)]

LISTB: [(А-а-а, [1, 2, 3]), (я в порядке, 1 ), (Нееет, [34, 3]), (Ив Ларок, [4, 5, 3, 9 ])]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...