问题 -我有一个学生类,它包含名称,卷号,三主题标记M1,M2,M3,和总的痕迹。我需要梳理Student对象根据其总标记如果有两个或以上的学生标记是相等的,那么排序就根据自己的名字。注 -我有谷歌,但没有得到预期计算器问题的解决每一个使用具有可比性和比较器接口。
我已创建的类Studnt
public class Student {
private String name;
private Integer rollNumber;
private int m1;
private int m2;
private int m3;
private int totMarks;
//Getter setter
}
大类
public class StudentData {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enetr the number of Student");
int totalStudent = sc.nextInt();
Map<Integer,Student> map = new TreeMap<Integer,Student>();
for(int i =0;i<totalStudent;i++) {
Student ss = new Student();
System.out.println("Enter the Student roll number");
ss.setRollNumber(sc.nextInt());
System.out.println("Enter the Student Name");
ss.setName(sc.next());
System.out.println("Enter the m1 marks ");
ss.setM1(sc.nextInt());
System.out.println("Enetr the m2 marks ");
ss.setM2(sc.nextInt());
System.out.println("Enter the m3 marks ");
ss.setM3(sc.nextInt());
ss.setTotMarks(ss.getM1()+ss.getM2()+ss.getM3());
map.put(ss.getTotMarks(),ss);
ss=null;
}
//stdList.forEach(System.out::print);
for(Map.Entry<Integer,Student> m :map.entrySet()) {
System.out.println(m);
}
}
}
其实,我使用TreeMap中它的排序值的键(占总分是我TreeMap中键)。但两个或两个以上的学生有平等的痕迹。然后,旧的学生对象(值)取代,因为主要的新的学生不允许重复
产量
6 =学生[NAME =粘弹性阻尼器,rollNumber = 12,M 1 = 2,M2 = 2,M3 = 2,totMarks = 6]
9 =学生[名称=普拉卡什,rollNumber = 56,M1 = 3,M2 = 3,M3 = 3,totMarks = 9]
存储在地图中唯一独特totMarks
既然你不能利用现有的比较或排序算法,你需要做的是你自己。我已经实现一个static
函数lessOrEqual
,它接受2分Student
的情况下,对它们进行比较,并返回是否s1
是小于或等于s2
。larger(Student s1, Student s2)
返回true IF ONLY s1
大于s2
。可以有这样做的许多不同的方式,这真的取决于你,因为它只是一个comprison。该函数首先检查成绩,如果成绩相匹配,它会再检查名称和相应的回报。
编辑:正如你可以看到我换成lessOrEqual
用larger
,因为选择排序我使用需求寻找larger
。这是同样的效果,我只能这样做是为了某种更好的可读性。
然后,我实现了另一个static
接受功能ArrayList<Student>
,排序,和它排序后返回。所使用的排序算法是很基本的:选择排序。它的O(N ^ 2),这是效率不高的,但我是做简单的在下面的演示起见。
码:
import java.util.ArrayList;
public class Student {
private String name;
private Integer rollNumber;
private int m1;
private int m2;
private int m3;
private int totMarks;
public static boolean larger(Student s1, Student s2){
if(s1.totMarks < s2.totMarks) return false;
else if (s1.totMarks > s2.totMarks) return true;
// compare names
else return s1.name.compareTo(s2.name) > 0;
}
public static ArrayList<Student> sortSelection(ArrayList<Student> list){
for(int i=0; i<list.size(); i++){
for(int j=i+1; j< list.size(); j++){
if(larger(list.get(i), list.get(j))){ // swap
Student temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
}
return list;
}
//Getter setter
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getTotMarks(){
return totMarks;
}
public void setTotMarks(int totMarks){
this.totMarks = totMarks;
}
@Override
public String toString(){
return String.format("Name: %20s - Total Marks: %3d", name, totMarks);
}
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
Student s4 = new Student();
s1.setName("John Smith");
s1.setTotMarks(98);
s2.setName("Jack Smith");
s2.setTotMarks(98);
s3.setName("Adam Noob");
s3.setTotMarks(100);
s4.setName("Ved Parkash");
s4.setTotMarks(99);
ArrayList<Student> list = new ArrayList<>();
list.add(s4);
list.add(s3);
list.add(s1);
list.add(s2);
System.out.println("Array before sorting:");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i).toString());
}
Student.sortSelection(list);
System.out.println("Array after sorting:");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i).toString());
}
}
}
输出:
Array before sorting:
Name: Ved Parkash - Total Marks: 99
Name: Adam Noob - Total Marks: 100
Name: John Smith - Total Marks: 98
Name: Jack Smith - Total Marks: 98
Array after sorting:
Name: Jack Smith - Total Marks: 98
Name: John Smith - Total Marks: 98
Name: Ved Parkash - Total Marks: 99
Name: Adam Noob - Total Marks: 100
笔记:
1)见另外,学生的顺序进入榜单,这是4,3,1,那么2。这是证明它根据名称排序时,等级匹配(杰克·史密斯VS约翰·史密斯)。
2)我存的是学生作一个更好的演示。
3)您可能会注意到,我没有设置任何其他变量,因为这个问题仅仅是有关排序,唯一的贡献变量的排序是:name
和totMarks
。你将不得不做休息。
4)我使用的ArrayList
,但不限于,与简单的改变,你可以用它正常的Student[]
阵列。
5)该函数larger
不必是static
,你可以把它的成员函数和不同的方式使用它。例如,上面的代码会改变为:
public boolean larger(Student other){
if(totMarks < other.totMarks) return false;
else if (totMarks > other.totMarks) return true;
// compare names
else return name.compareTo(other.name) > 0;
}
public static ArrayList<Student> sortSelection(ArrayList<Student> list){
for(int i=0; i<list.size(); i++){
for(int j=i+1; j< list.size(); j++){
// comparison way changes accordingly
if(list.get(i).larger(list.get(j))){ // swap
Student temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
}
return list;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句