所以我有一个对象列表,我想根据对象的每个名称的特征进行排序(按字母顺序排列)。我们需要按字母顺序“粗略地”使用它,因此我认为这是插入排序算法的平庸实现。但是,我只能按字母顺序对一个项目进行排序。我已经在这几个小时了,似乎已经遇到了障碍。
public void sort(){
int i=1;
while(list[i]!=null) { //while there is an element in the array
String one=list[i-1].getName(); //get the name of the "first object"
String two=list[i].getName(); //get the name of the "second object"
if(two.compareTo(one)==0){ // if equal move on
i++;
}
else if(two.compareTo(one)<0){// two is before one
Contact temp =list[i-1]; //store this temporarily
list[i-1]=list[i]; //swap them
list[i]=temp; //put temp back where it belongs
i++; //check next elements
}
i++
}
}
这是列表,排序之前和之后的内容...... http://image.prntscr.com/image/698cf44309ee43c29532ebe71a4925fe.png
答案 0 :(得分:0)
首先,您必须了解插入排序的工作原理。
因此,插入排序为O(n ^ 2),这意味着它至少需要一个嵌套循环。
以下是修改后的版本:
int i = 1;
while(list[i] != null) {
// i divides sorted and unsorted
// try to insert i to the right place, so loop j from i-1 to 0
int j = i;
while (j > 0) {
String one = list[j-1].getName();
String two = list[j].getName();
int cmp = one.compareTo(two);
if (cmp <= 0) {
break;
}
Contact temp = list[j-1];
list[j-1] = list[j];
list[j] = temp;
--j;
}
++i;
}
答案 1 :(得分:0)
实现插入排序的方法有很多种。我将向您解释一种更简单的方法,通过该方法可以按照您的解释按名称对对象数组进行排序。 插入排序的关键属性是:
插入排序从他离开数组的末尾开始并前进到 右。
此排序机制不会查看右侧的元素, 而是专注于当前遇到的项目并拖回 该项目是正确的位置。
让我们记住这些事情的代码!!
/*
* Performs Insertion sort on given array of contacts!!
*/
public static Contact[] sortContacts(Contact[] contacts){
int n = contacts.length;
// Advance the pointer to right
for(int i = 0; i < n; i++){
/*
* Compare current item with previous item.
* If current item is not in it's correct position,
* swap until it's dragged back to it's correct position.
* (Ascending order!!)
*/
for(int j = i; j > 0; j--){
if(less(contacts[j], contacts[j - 1])){
swap(contacts, j, j - 1);
}else{
break;
}
}
}
return contacts;
}
private static boolean less(Contact a, Contact b){
return a.getName().compareTo(b.getName()) < 0;
}
private static void swap(Contact[] contacts, int i, int j){
Contact temp = contacts[i];
contacts[i] = contacts[j];
contacts[j] = temp;
}
这三种方法有助于您的排序!!
现在要测试它,让我们创建一些联系人并对它们进行排序!!
Contact one = new Contact();
one.setName("tony");
one.setPhone("6666");
one.setMail("kkk@lll.com");
Contact two = new Contact();
two.setName("steve");
two.setPhone("777");
two.setMail("rrr@mmm.com");
Contact three = new Contact();
three.setName("clint");
three.setPhone("333");
three.setMail("ggg@sss.com");
Contact four = new Contact();
four.setName("bruce");
four.setPhone("222");
four.setMail("bbb@ccc.com");
让我们排序:
Contact[] res = Insertion.sortContacts(new Contact[]{one,two,three,four});
for(Contact c : res){
System.out.println(c);
}
这会产生输出:
Contact [name=bruce, mail=bbb@ccc.com, phone=222]
Contact [name=clint, mail=ggg@sss.com, phone=333]
Contact [name=steve, mail=rrr@mmm.com, phone=777]
Contact [name=tony, mail=kkk@lll.com, phone=6666]
根据每个联系人的姓名排序! 我希望这是你想要实现的目标
答案 2 :(得分:-1)
您可以在课堂上使用interface Comparable
。
示例:
public class Contact implements Comparable<Contact>
// ...
public int compareTo(Contact other) {
return getName().compareTo(other.getName());
}
}
然后,如果list
是一个数组:
Arrays.sort(list);