Java 可比排序数

Java 可比排序数,java,Java,这是我的完整程序 public class Client { public static void main(String args[]) { ArrayList < Student > studentsList = new ArrayList <> (); Student std1 = new Student("Ram","01-01-1981","1203"); Student std2 = new St

这是我的完整程序

 public class Client {
    public static void main(String args[]) {  
        ArrayList < Student > studentsList = new ArrayList <> ();

        Student std1 = new Student("Ram","01-01-1981","1203");
        Student std2 = new Student("Raj","01-01-1981","1204");
        Student std3 = new Student("Hanish","01-01-1981","403");
        Student std4 = new Student("Hanish","01-01-1981","");

        studentsList.add(std1);
        studentsList.add(std2);
        studentsList.add(std3);
        studentsList.add(std4);

        Collections.sort(studentsList);
        System.out.println(studentsList);

    }
}
公共类客户端{
公共静态void main(字符串args[]){
ArrayListstudentsList=新的ArrayList();
学生std1=新生(“Ram”、“01-01-1981”、“1203”);
学生std2=新生(“Raj”、“01-01-1981”、“1204”);
学生std3=新生(“哈尼什”,“01-01-1981”,“403”);
Student std4=新生(“Hanish”、“01-01-1981”和“);
学生名单新增(std1);
学生名单新增(std2);
学生名单添加(std3);
学生名单添加(std4);
集合。排序(学生列表);
系统输出打印LN(学生列表);
}
}

当我打印时,我看到总账编号不是按ACS发送顺序来的,问题是您比较的是字符串GlNumber,而不是它所代表的数字。您在代码中声明GLNumber是字母数字的,所以我认为公平地说,您的比较器符合规范

“1204”

1204>403


另一方面:为什么还要将studentDOJ存储为String呢?看起来应该是
java.time.LocalDate

发生这种情况是因为您的glNumber是字符串,您需要数字升序

您可以通过以下示例了解问题

样本1

List stringList = Arrays.asList("1","2","10");
Collections.sort(stringList);
System.out.println(stringList);
// Returns [1, 10, 2]
样本2

List numberList = Arrays.asList(1,2,10);
Collections.sort(numberList);
System.out.println(numberList);
// Returns [1, 2, 10]
现在,您的问题的解决方案。请尝试在下面进行比较(…)


创建studentDateComparator,它实现Comparator,如下所示:

@Override
public int compare(Student a, Student b) {
    // ascending
    // int r = a.getStudentDOJ().compareTo(b.getStudentDOJ());
    // decending
    int r = b.getStudentDOJ().compareTo(a.getStudentDOJ());
    if (r == 0) {
        r = comparison(a, b);
    }
    return r;
}

public int comparison(Student a, Student b) {

    String s1 = a.getGlNumber();
    String s2 = b.getGlNumber();

    String[] pt1 = s1.split("((?<=[a-z])(?=[0-9]))|((?<=[0-9])(?=[a-z]))");
    String[] pt2 = s2.split("((?<=[a-z])(?=[0-9]))|((?<=[0-9])(?=[a-z]))");

    // pt1 and pt2 arrays will have the string split in alphabets and numbers

    int i = 0;
    if (Arrays.equals(pt1, pt2))
        return 0;
    else {
        for (i = 0; i < Math.min(pt1.length, pt2.length); i++)
            if (!pt1[i].equals(pt2[i])) {
                if (!isNumber(pt1[i], pt2[i])) {
                    if (pt1[i].compareTo(pt2[i]) > 0)
                        return 1;
                    else
                        return -1;
                } else {
                    int nu1 = Integer.parseInt(pt1[i]);
                    int nu2 = Integer.parseInt(pt2[i]);
                    if (nu1 > nu2)
                        return 1;
                    else
                        return -1;
                }
            }
    }

    if (pt1.length > i)
        return 1;
    else
        return -1;
}

private static Boolean isNumber(String n1, String n2) {
    // TODO Auto-generated method stub
    try {
        int nu1 = Integer.parseInt(n1);
        int nu2 = Integer.parseInt(n2);
        return true;
    } catch (Exception x) {
        return false;
    }

}
}

您的主要方法如下:

public static void main(String args[]) throws ParseException {
    ArrayList<Student> studentsList = new ArrayList<>();

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");

    Student std1 = new Student("Ram", "01-01-1981", "1203");
    Student std2 = new Student("Raj", "01-01-1981", "1204");
    Student std3 = new Student("Hanish", "01-01-1981", "403");
    Student std4 = new Student("Hanish", "01-01-1981", "");

    studentsList.add(std1);
    studentsList.add(std2);
    studentsList.add(std3);
    studentsList.add(std4);

    System.out.println(studentsList);

    Collections.sort(studentsList, new studentDateComparator());

    System.out.println(studentsList);

}
publicstaticvoidmain(字符串args[])引发异常{
ArrayList studentsList=新建ArrayList();
SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MM-yyyy”);
学生std1=新生(“Ram”、“01-01-1981”、“1203”);
学生std2=新生(“Raj”、“01-01-1981”、“1204”);
学生std3=新生(“哈尼什”,“01-01-1981”,“403”);
Student std4=新生(“Hanish”、“01-01-1981”和“);
学生名单新增(std1);
学生名单新增(std2);
学生名单添加(std3);
学生名单添加(std4);
系统输出打印LN(学生列表);
排序(studentsList,newstudentdatecomparator());
系统输出打印LN(学生列表);
}

}

使用此选项可获得所需的解决方案

int extractInt(String s) {
        String num = s.replaceAll("\\D", "");
        // return 0 if no digits found
        return num.isEmpty() ? 0 : Integer.parseInt(num);
    }

@Override
public int compareTo(Student other) {
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
  return Comparator.comparing((Student student) -> LocalDate.parse(student.getStudentDOJ(), formatter)).reversed()
          .thenComparing(student -> extractInt(student.getGlNumber()))
      .compare(this, other);
}

您正在对
GlNumber
进行词汇比较,而不是数字比较。从词汇上讲,
1204
位于
403
之前。由于您的代码注释说明
GlNumber
是字母数字,您希望如何进行数字比较?您的输出在我看来是正确的。您是否打算将
GLNumber
设置为
Integer
,而不是
String
[“”、“1203”、“1204”、“403”]
在我看来就像升序字符串。如果这些值按照您的代码注释是字母数字:在进行比较之前,请将所有值用前导零或空格填充到固定长度。如果它们实际上是数字而不是字母数字,请转换为
整数
@Hanish-我已经告诉过你如何修复它。您希望
GLNumber
成为
整数
,而不是
字符串
。感谢您的参与。我建议您不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。我还没有发现你的代码有什么更干净的地方。提问者通过使用来自的
LocalDate
DateTimeFormatter
做了正确的事情。谢谢@OleV.V,我已经对我的代码进行了更正。您的输出将是[Student[studentName=Hanish,studentDOJ=01-01-1981,GlNumber=],studentName=Hanish,studentDOJ=01-01-1981,GlNumber=403],studentName=Ram,studentDOJ=01-01-1981,GlNumber=1203],Student[studentName=Raj,studentDOJ=01-01-01-1981,GlNumber=1204]]
public static void main(String args[]) throws ParseException {
    ArrayList<Student> studentsList = new ArrayList<>();

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");

    Student std1 = new Student("Ram", "01-01-1981", "1203");
    Student std2 = new Student("Raj", "01-01-1981", "1204");
    Student std3 = new Student("Hanish", "01-01-1981", "403");
    Student std4 = new Student("Hanish", "01-01-1981", "");

    studentsList.add(std1);
    studentsList.add(std2);
    studentsList.add(std3);
    studentsList.add(std4);

    System.out.println(studentsList);

    Collections.sort(studentsList, new studentDateComparator());

    System.out.println(studentsList);

}
int extractInt(String s) {
        String num = s.replaceAll("\\D", "");
        // return 0 if no digits found
        return num.isEmpty() ? 0 : Integer.parseInt(num);
    }

@Override
public int compareTo(Student other) {
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
  return Comparator.comparing((Student student) -> LocalDate.parse(student.getStudentDOJ(), formatter)).reversed()
          .thenComparing(student -> extractInt(student.getGlNumber()))
      .compare(this, other);
}