Java 根据优先级重新排列阵列

Java 根据优先级重新排列阵列,java,arrays,sorting,Java,Arrays,Sorting,有Person类的对象,如:M1、M2、M3、M4、M5、W1、W2、W3、W4、C1、C2。其中M:男人,W:女人,C:孩子 它们存储在以下阵列中: Person[] arr = {M1,M3,C1,W1,W3,M2,M4,W2,C2,W4,M5}; 现在,必须根据为每种类型的对象设置的优先级重新排列数组。优先级在枚举中给出: enum Priority{ One, Two, Three; } 还要确保顺序保持不变,例如:M1应该在M2之前,M2应该在M3之前,等等

有Person类的对象,如:M1、M2、M3、M4、M5、W1、W2、W3、W4、C1、C2。其中M:男人,W:女人,C:孩子

它们存储在以下阵列中:

Person[] arr = {M1,M3,C1,W1,W3,M2,M4,W2,C2,W4,M5};
现在,必须根据为每种类型的对象设置的优先级重新排列数组。优先级在枚举中给出:

enum Priority{
    One,
    Two,
    Three;
}
还要确保顺序保持不变,例如:M1应该在M2之前,M2应该在M3之前,等等

输入:Person[]arr={M1,M3,C1,W1,W3,M2,M4,W2,C2,W4,M5}; 人类的优先权:优先权,二 女人的优先权:优先权。一 儿童优先:优先。三

预期产出:人员[]arr={W1、W2、W3、W4、M1、M2、M3、M4、M5、C1、C2}

输出不正确:Person[]arr={W1,W3,W2,W4,M1,M5,M4,M3,M2,C2,C1}


后者是错误的,因为顺序也必须保持不变。

我认为您必须为Person类创建自己的比较器,以便可以使用Collections.sort方法在集合中对Person对象进行排序

下面是一个关于如何为类创建自己的比较器的链接

我认为您必须为Person类创建自己的comparator,以便可以使用Collections.sort方法在集合中对Person对象进行排序

下面是一个关于如何为类创建自己的比较器的链接
以下是使用Comparator接口对自定义对象进行排序的解决方案

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Person {

private int priority;
private String objName;

Person(String name,int value){
    this.objName = name;
    this.priority = value;
}

public int getPriority() {
    return priority;
}

public void setPriority(int priority) {
    this.priority = priority;
}

public String getObjName() {
    return objName;
}

public void setObjName(String objName) {
    this.objName = objName;
}   

public static void main(String[] args) {
    Person M1 = new Person("M1",Priority.valueOf("ONE").getValue());
    Person M2 = new Person("M2",Priority.valueOf("ONE").getValue());
    Person M3 = new Person("M3",Priority.valueOf("ONE").getValue());
    Person M4 = new Person("M4",Priority.valueOf("ONE").getValue());
    Person M5 = new Person("M5",Priority.valueOf("ONE").getValue());
    Person W1 = new Person("W1",Priority.valueOf("THREE").getValue());
    Person W2 = new Person("W2",Priority.valueOf("THREE").getValue());
    Person W3 = new Person("W3",Priority.valueOf("THREE").getValue());
    Person W4 = new Person("W4",Priority.valueOf("THREE").getValue());      
    Person C1 = new Person("C1",Priority.valueOf("TWO").getValue());
    Person C2 = new Person("C2",Priority.valueOf("TWO").getValue());

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

    List<Person> list = Arrays.asList(arr);

    System.out.println("Before sort...");
    for(Person p : list){
        System.out.println(p.getObjName());
    }

    Collections.sort(list, new PersonComparator<Person>());

    System.out.println("After sort...");
    for(Person p : list){
        System.out.println(p.getObjName());
    }
}

}

enum Priority{  
ONE(1),TWO(2),THREE(3); 

private int value;  
public int getValue() {
    return value;
}   
Priority(int v){
    this.value = v;
}
}

class PersonComparator<T> implements Comparator<Person> {
public int compare(Person p1, Person p2) {
    //Sorting based on priority
    int v1 = p1.getPriority();
    int v2 = p2.getPriority();
    ;
    if (v1 - v2 == 0) {
        //Sorting based on object name
        int i1 = Integer.parseInt(p1.getObjName().substring(1, 2));
        int i2 = Integer.parseInt(p2.getObjName().substring(1, 2));
        return i1 - i2;
    }
    return v1 - v2;
}
}

下面是使用Comparator接口对自定义对象进行排序的解决方案

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Person {

private int priority;
private String objName;

Person(String name,int value){
    this.objName = name;
    this.priority = value;
}

public int getPriority() {
    return priority;
}

public void setPriority(int priority) {
    this.priority = priority;
}

public String getObjName() {
    return objName;
}

public void setObjName(String objName) {
    this.objName = objName;
}   

public static void main(String[] args) {
    Person M1 = new Person("M1",Priority.valueOf("ONE").getValue());
    Person M2 = new Person("M2",Priority.valueOf("ONE").getValue());
    Person M3 = new Person("M3",Priority.valueOf("ONE").getValue());
    Person M4 = new Person("M4",Priority.valueOf("ONE").getValue());
    Person M5 = new Person("M5",Priority.valueOf("ONE").getValue());
    Person W1 = new Person("W1",Priority.valueOf("THREE").getValue());
    Person W2 = new Person("W2",Priority.valueOf("THREE").getValue());
    Person W3 = new Person("W3",Priority.valueOf("THREE").getValue());
    Person W4 = new Person("W4",Priority.valueOf("THREE").getValue());      
    Person C1 = new Person("C1",Priority.valueOf("TWO").getValue());
    Person C2 = new Person("C2",Priority.valueOf("TWO").getValue());

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

    List<Person> list = Arrays.asList(arr);

    System.out.println("Before sort...");
    for(Person p : list){
        System.out.println(p.getObjName());
    }

    Collections.sort(list, new PersonComparator<Person>());

    System.out.println("After sort...");
    for(Person p : list){
        System.out.println(p.getObjName());
    }
}

}

enum Priority{  
ONE(1),TWO(2),THREE(3); 

private int value;  
public int getValue() {
    return value;
}   
Priority(int v){
    this.value = v;
}
}

class PersonComparator<T> implements Comparator<Person> {
public int compare(Person p1, Person p2) {
    //Sorting based on priority
    int v1 = p1.getPriority();
    int v2 = p2.getPriority();
    ;
    if (v1 - v2 == 0) {
        //Sorting based on object name
        int i1 = Integer.parseInt(p1.getObjName().substring(1, 2));
        int i2 = Integer.parseInt(p2.getObjName().substring(1, 2));
        return i1 - i2;
    }
    return v1 - v2;
}
}
试试下面

    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()));
请注意:枚举中的值是有序的,上面的代码取决于枚举类中值的顺序

编辑-1

比较器

    Comparator<Person> comp = new Comparator<Person>() {
        @Override
        public int compare(Person p1, Person p2) {
            int co = p1.getPriority().compareTo(p2.getPriority());
            if (co == 0)
                return Integer.parseInt(p1.getName().substring(1)) - Integer.parseInt(p2.getName().substring(1));
            return co;
        }
    };
试试下面

    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()));
请注意:枚举中的值是有序的,上面的代码取决于枚举类中值的顺序

编辑-1

比较器

    Comparator<Person> comp = new Comparator<Person>() {
        @Override
        public int compare(Person p1, Person p2) {
            int co = p1.getPriority().compareTo(p2.getPriority());
            if (co == 0)
                return Integer.parseInt(p1.getName().substring(1)) - Integer.parseInt(p2.getName().substring(1));
            return co;
        }
    };

Saravana,我能不使用Stream做同样的事情吗。。我想说的是,我以前的解决方案是什么java8@RoyalTiger我已经添加了比较器,您可以在Collections.sort或Array.sortSaravana中使用它,我可以在不使用Stream的情况下使用它吗。。我想说的是,我以前的解决方案是什么java8@RoyalTiger我添加了Comparator,您可以在Collections.sort或Array中使用它。sortI无法以这种方式执行此操作。对象在数组中给定,不能修改Person类。只有Priority enum类包含每种类型对象的优先级。“你能建议其他的方法吗?”我很高兴,这有帮助。我不能用这种方法。对象在数组中给定,不能修改Person类。只有Priority enum类包含每种类型对象的优先级。“你能建议其他的方法吗?”我很高兴,这很有帮助。我已经改变了说法。它必须“重新排列”,而不是“排序”。我认为这个词有误导性。我已经重新措辞了这个声明。它必须“重新排列”,而不是“排序”。我认为这个词有误导性。