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”403”
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);
}