-1

I have an array of "Members" in a special order:

ArrayList<Member> sortedMembers

I have another array of "Members" that may or may not contain all the members from the first list.

ArrayList<Member> unsortedMembers

In order to tell if a member from the first list is equal to a member in the second list, the Member class has an Integer property called memberId.

So how can I order the second list in the most efficient method possible? I really want best effort, as in, if a Member is not contained in the first list, just append the member at the end of the second.

trilogy
  • 1,738
  • 15
  • 31

1 Answers1

1

You need to find the items in the sort-order list and then, if present, grab their indices and sort using those.

SortList.java

import java.util.*;

public class SortList {
    public static void main(String[] args) {
        List<Member> list = Arrays.asList(
            new Member( 1, "A"),
            new Member( 3, "C"),
            new Member(26, "Z"),
            new Member( 4, "D")
        );

        List<Member> order = Arrays.asList(
            new Member(4, "D"),
            new Member(3, "C"),
            new Member(2, "B"),
            new Member(1, "A")
        );

        sortBasedOn(list, order);

        list.stream().forEach(System.out::println);
    }

    public static <E> void sortBasedOn(List<E> toSort, List<E> ref, Comparator<E> comparator) {
        Collections.sort(toSort, comparator);
    }

    public static void sortBasedOn(List<Member> toSort, List<Member> ref) {
        sortBasedOn(toSort, ref, (left, right) -> {
            Optional<Member> foundLeft = ref.stream().filter(x -> x.getMemberId() == left.getMemberId()).findFirst();
            Optional<Member> foundRight = ref.stream().filter(x -> x.getMemberId() == right.getMemberId()).findFirst();
            if (!foundLeft.isPresent()) return 1;
            if (!foundRight.isPresent()) return -1;
            return Integer.compare(ref.indexOf(foundLeft.get()), ref.indexOf(foundRight.get()));
        });
    }
}

Member.java

public static class Member {
    private int memberId;
    private String name;

    public Member(int memberId, String name) {
        this.memberId = memberId;
        this.name = name;
    }

    public int getMemberId() {
        return memberId;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return String.format("Member [memberId=%s, name=%s]", memberId, name);
    }
}
Mr. Polywhirl
  • 42,981
  • 12
  • 84
  • 132