2013-04-24 49 views
0

其實我想排序對象的數組列表。我正在使用Comparable接口來達到此目的。這是完全有效的但問題是,當我正在整理是給這兩個問題。排序ArrayList <Object>通過比較接口

  1. 所有有第一個字母大寫的名字都在頂部聚集在一起,所有有第一個字母的名字都在底部聚集在一起。

  2. 所有排序的大寫字母單詞在所有小字母單詞都在底部合在一起後就會聚集在一起。

這裏是我的豆

MyShares.java

public class Myshares implements Comparable<Myshares> { 

     int id, parent; 
     String name, path, type, shared_with, shared_or_not, upload_request; 

     public int getParent() { 
      return parent; 
     } 

     public void setParent(int parent) { 
      this.parent = parent; 
     } 

     public String getUpload_request() { 
      return upload_request; 
     } 

     public void setUpload_request(String upload_request) { 
      this.upload_request = upload_request; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getPath() { 
      return path; 
     } 

     public void setPath(String path) { 
      this.path = path; 
     } 

     public String getType() { 
      return type; 
     } 

     public void setType(String type) { 
      this.type = type; 
     } 

     public String getShared_with() { 
      return shared_with; 
     } 

     public void setShared_with(String shared_with) { 
      this.shared_with = shared_with; 
     } 

     public String getShared_or_not() { 
      return shared_or_not; 
     } 

     public void setShared_or_not(String shared_or_not) { 
      this.shared_or_not = shared_or_not; 
     } 

     @Override 
     public int compareTo(Myshares another) { 

      return this.name.compareTo(another.getName()); 
     } 

    } 

這是輸出

enter image description here

我認爲這爲b使用ASCII碼。我想要一個完整的排序列表。請看一下。

+0

如果你認爲是基於ASCII碼,你爲什麼不只是比較.toUpper()? – 2013-04-24 07:15:06

回答

6

如果你希望一個不區分大小寫的排序,我建議改變你compareTo()方法,而不是使用StringcompareToIgnoreCase()方法 - 即:

public int compareTo(Myshares another) { 
    return this.name.compareToIgnoreCase(another.getName()); 
} 
+0

@Downvoter:你爲什麼低估這個好答案? – jlordo 2013-04-24 07:18:13

+0

@jlordo:可能是因爲錯字('compareToIgnoringCase()',而不是'compareToIgnoreCase()')。這是一個艱難的觀衆! – nullPainter 2013-04-24 07:24:14

+0

我一看到就修好了;) – jlordo 2013-04-24 07:25:25

5

變化

@Override 
public int compareTo(Myshares another) { 
    return this.name.compareTo(another.getName()); 
} 

@Override 
public int compareTo(Myshares another) { 
    return String.CASE_INSENSITIVE_ORDER.compare(this.name, another.getName()); 
} 

或使用更多可讀且也是非常好的解決方案發布者nullPainter

2

您應調整compareTo()方法

return this.name.toLowerCase().compareTo(another.getName().toLowerCase()); 
+1

我必須承認,由nullPainter提出的'compareToIgnoreCase'將是更好的解決方案,因爲我的空白不是安全的 – 2013-04-24 07:18:44

+0

+1供認。 – 2013-04-24 18:25:18

2

替換爲compareTo方法:

public int compareTo(Myshares another) { 
    return this.name.compareToIgnoreCase(another.getName()); 
} 
2

我給你一些源到現有的比較我寫不完整的字母數字排序,並將努力數字的名字像10,1等

要使用它,你可以這樣做:Collections.sort(myList,comparator);

替代方法也會在您的比較方法中以雙方小寫。但是,只要有數字或符號,它就會被拋棄,所以我會親自使用比較器。

結帳與源代碼中的要點是:https://gist.github.com/gondor/9328de5fa0cce130bc3b

+0

你不覺得它很長嗎。 – 2013-04-24 07:21:11

+0

根據你的需要,如果你用1name,2name,10name或任何其他符號打字的話,你會發現它會按照1name,10name等進行排序。這個比較器將所有這些考慮在內並完美排序。甚至會正確地對IP地址或主機名進行排序。 – 2013-04-24 07:22:03

+0

只有鏈接的答案在這個網站上不是很好。如果鏈接過時,答案就沒用了。您應該始終複製答案的相關部分,並且您仍然可以鏈接到源代碼。 – jlordo 2013-04-24 07:24:41