2014-04-21 105 views
0

我想按降序對我的arraylist中存在的元素進行排序。但是,實施中似乎存在一些問題。我只是java的初學者,並且正在嘗試使用最簡單的方法進行排序。在arraylist中排序

student temp = new student(user_name,given_name,family_name,tot_marks); 

for(int j=0;j<list1.size()-1;j++) 

{ 

    for(int k=0;k<list1.size();k++) 

    { 

     student sort1 = list1.get(j); 

     student sort2 = list1.get(k); 

     if(sort1.tot_marks < sort2.tot_marks) 

     { 

      temp.user_name=sort1.user_name; 

      temp.family_name=sort1.family_name; 

      temp.given_name=sort1.given_name; 

      temp.tot_marks=sort1.tot_marks; 

      sort2.user_name=temp.user_name; 

      sort2.family_name=temp.family_name; 

      sort2.given_name=temp.given_name; 

      sort2.tot_marks=temp.tot_marks; 

      sort1.family_name=sort2.family_name; 

      sort1.given_name=sort2.given_name; 

      sort1.tot_marks=sort2.tot_marks; 

      list1.add(sort1); //Adding sorted elements to the arraylist. 

     } 

     //If marks are same, sort on the basis of username. 

     else if(sort1.tot_marks == sort2.tot_marks) 

     { 

      //Compare usernames whichever is greater. 

      { 

       temp.user_name=sort1.user_name; 

       temp.family_name=sort1.family_name; 

       temp.given_name=sort1.given_name; 

       temp.tot_marks=sort1.tot_marks; 

       sort2.user_name=temp.user_name; 

       sort2.family_name=temp.family_name; 

       sort2.given_name=temp.given_name; 

       sort2.tot_marks=temp.tot_marks; 

       sort1.family_name=sort2.family_name; 

       sort1.given_name=sort2.given_name; 

       sort1.given_name=sort2.given_name; 

       sort1.tot_marks=sort2.tot_marks; 

       list1.add(sort1); 

      } 

     } 

    } 

} 

//Print the sorted list. 

for (int i=0;i<list1.size();i++) 

{ 

    student display = list1.get(i); 

    System.out.println(display.tot_marks+","+display.given_name+" 
"+display.family_name); 

} 
+2

你並不需要手動排序您的數組,檢查這個問題:http://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property – elbaulp

+0

你可以實現一個比較並使用內置的排序方法。如果你感興趣,你應該查找一些排序算法,如Quicksort,Bubblesort,Insertionsort等。 – keyser

+0

它顯示了糟糕的設計。 –

回答

0

在Java中排序List你應該使用Collections.sortComparator

Collections.sort(list1, new Comparator<student>() { 
    public int compare(student a, student b) { 
     if(a.tot_marks < b.tot_marks) 
      return -1; 
     else if (a.tot_marks > b.tot_marks) 
      return 1; 
     else 
      return a.username.compareTo(b.username); 
    } 
}); 
0

不需要那個。您將重複添加到您的列表中。

list1.add(sort1); //Adding sorted elements to the arraylist. 

檢查您的交換邏輯。它應該是:

TEMP = SORT1 
SORT1 = SORT2 
SORT2 = TEMP 
+0

我正在嘗試交換Sort1和Sort2對象指向的所有值。實現上述3個LOC只會交換對象的引用,不是嗎? – MrCoder

+0

我想在這裏不使用集合。使用非常基本的方法.... – MrCoder

+0

它是一個**僞代碼**只。將它轉換爲Java代碼。 –

0

要走的路是拋棄你的方法,讓你的student類實現Comparable接口:public class student implements Comparable<student>。另外,在Java中,類名應該以大寫字母開頭。

一旦你讓你的課程實現這個接口,你將被迫執行compareTo(student student)方法。

在這種方法中,你會實現你的比較邏輯:

public int compareTo(student student) 
{ 
    if(this.marks != student.marks) 
    { 
      return Integer.compare(this.marks, student.marks); 
    } 
    else 
    { 
      return this.name.compareTo(student.name); 
    } 
} 

然後,整理你的陣列,只需調用就像這樣:

List<student> students = ... 
Collections.sort(students); 

以上會打電話給你的.compareTo的實施並相應地對數組進行排序。

+0

此鏈接很有幫助:http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/ – niiraj874u

+0

我正在嘗試不使用集合。我正在嘗試通過手動方法進行分類。 – MrCoder

+0

@MrCoder:那麼你可以考慮Denis Kulagin的方法。如果這是家庭作業,建議您如此標記您的問題。您也不需要複製每個元素。將數組元素分配給臨時變量將會起作用(在這種情況下)。 – npinti

0

排序的ArrayList的降序排列,請執行比較接口 和丹尼斯正確地指出out.Do不重複的元素

0
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

public class MyArrayListSort { 

public static void main(String a[]){ 

    List<Student> list = new ArrayList<Student>(); 
    list.add(new Student("Ram",3000)); 
    list.add(new Student("John",6000)); 
    list.add(new Student("Crish",2000)); 
    list.add(new Student("Tom",2400)); 
    Collections.sort(list,new MyMarkComp()); 
    System.out.println("Sorted list entries: "); 
    for(Student e:list){ 
     System.out.println(e); 
    } 
} 

}

類MyMarkComp實現比較{

@Override 
public int compare(Student e1, Student e2) { 
    if(e1.getMarks() < e2.getMarks()){ 
     return 1; 
    } else { 
     return -1; 
    } 
} 

}

類學生{

private String name; 
private int mark; 

public Student(String n, int s){ 
    this.name = n; 
    this.salary = s; 
} 

public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public int getMarks() { 
    return mark; 
} 
public void setMarks(int mark) { 
    this.mark = mark; 
} 
public String toString(){ 
    return "Name: "+this.name+"-- Marks: "+this.mark; 
} 

}

1

你可能只是做:

Collections.sort(list1, new Comparator<student>() { 

    @Override 
    public int compare(student one, student another) { 
     if (one.tot_marks == another.tot_marks) { 
      return 0; 
     } 
     return one.tot_marks > another.tot_marks ? 1 : -1; 
    } 
}); 

但是一些建議:

  • 類的名稱,如student是不是眼睛對於Java開發人員很容易的。嘗試使用大寫的駱駝案例類名稱(在這種情況下爲Student
  • 成員名中的下劃線在java中也不是很好,請嘗試駱駝案例名稱(totMarks)。更好的是,它是一個替代者,而不是讓它公開。(getTotMarks(),setTotMarks(int)
  • 在做像你這樣的事情之前,先試着研究一下!有一個很好的機會,有人在你面前寫下它!