RoyalTiger RoyalTiger - 2 months ago 7
Java Question

Rearrange the array based on priority

There are objects of

Person
class like: M1,M2,M3,M4,M5,W1,W2,W3,W4,C1,C2. Where M: Man, W: Woman, C: Child

They are stored in the array below:

Person[] arr = {M1,M3,C1,W1,W3,M2,M4,W2,C2,W4,M5};


Now the array has to be rearranged based on a priority set for each type of objects. Priorites are given in a Enum:

enum Priority{
One,
Two,
Three;
}


Also make sure that the order remain same, for example: M1 should come before M2, M2 should come before M3 and so on...

Input:
Person[] arr = {M1,M3,C1,W1,W3,M2,M4,W2,C2,W4,M5};

and Priority for Man: Priority.Two
Priority for Woman: Priority.One
Priority for Child: Priority.Three

Expected Output:
Person[] arr = {W1,W2,W3,W4,M1,M2,M3,M4,M5,C1,C2};


Incorrect Output:
Person[] arr = {W1,W3,W2,W4,M1,M5,M4,M3,M2,C2,C1};


The latter is wrong, since order must also remain same.

Answer

Try below

    final List<Person> persons = new ArrayList<>();
    IntStream.rangeClosed(1, 5).mapToObj(i -> new Person("M" + i, Priority.TWO)).forEach(persons::add);
    IntStream.rangeClosed(1, 4).mapToObj(i -> new Person("W" + i, Priority.ONE)).forEach(persons::add);
    IntStream.rangeClosed(1, 2).mapToObj(i -> new Person("C" + i, Priority.THREE)).forEach(persons::add);
    persons.add(new Person("M11", Priority.TWO)); // test to sort by number
    List<Person> sorted = persons.stream()
            .sorted(Comparator.comparing(Person::getPriority).thenComparingInt(p -> Integer.parseInt(p.getName().substring(1))))
            .collect(Collectors.toList());
    System.out.println("Before sort " + persons.stream().map(Person::getName).collect(Collectors.toList()));
    System.out.println("After sort " + sorted.stream().map(Person::getName).collect(Collectors.toList()));

ouput

Before sort [M1, M2, M3, M4, M5, W1, W2, W3, W4, C1, C2, M11]
After sort [W1, W2, W3, W4, M1, M2, M3, M4, M5, M11, C1, C2]

please note: The values in enum are ordered, above code depends on the order of values in enum class