Discussion:
[問題] 使用Comparable排序
(时间太久无法回复)
tsya
2007-05-19 03:55:42 UTC
Permalink
是這樣的

我想要排序一個Array

元素如下

class Element implements Comparable<Element>{
int value;
String name;
public int compareTo(Element other){
return this.value-other.value;
}
Element(int n,String s){
this.value=n;
this.name=s;
}
public String toString(){
return "value = "+this.value;
}
}

在main method裡面做排序

import java.util.*;
class Sort{
public static void main(String[] args){
Element[] e=new Element[5];
e[0]=new Element(1,"Apple");
e[1]=new Element(2,"Azure");
e[2]=new Element(5,"Apply");
e[3]=new Element(3,"Adapt");
e[4]=new Element(4,"Adept");
System.out.println(Arrays.toString(e));
Arrays.sort(e);
System.out.println(Arrays.toString(e));
}
}

排序value 的部分非常成功

[value = 1, value = 2, value = 5, value = 3, value = 4]
[value = 1, value = 2, value = 3, value = 4, value = 5]

但是排序name就不知道怎麼寫了

我參考這個網頁

http://www.rgagnon.com/javadetails/java-0343.html

但是他只有教排序String Array

請問含有String的Object Array應如何排序?

請給我一些觀念可以嗎?

謝謝

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.132.132.7
勁過呂布
2007-05-19 04:09:25 UTC
Permalink
※ 引述《tsya (tsya)》之銘言:
: public int compareTo(Element other){
: return this.value-other.value;
: }

就把這個改成 compare 兩個 object 的 name 就行啊...

參考 API 的 String.compareTo()....

: 在main method裡面做排序
: import java.util.*;
: class Sort{
: public static void main(String[] args){
: Element[] e=new Element[5];
: e[0]=new Element(1,"Apple");
: e[1]=new Element(2,"Azure");
: e[2]=new Element(5,"Apply");
: e[3]=new Element(3,"Adapt");
: e[4]=new Element(4,"Adept");
: System.out.println(Arrays.toString(e));
: Arrays.sort(e);
: System.out.println(Arrays.toString(e));
: }
: }
: 排序value 的部分非常成功
: [value = 1, value = 2, value = 5, value = 3, value = 4]
: [value = 1, value = 2, value = 3, value = 4, value = 5]
: 但是排序name就不知道怎麼寫了
: 我參考這個網頁
: http://www.rgagnon.com/javadetails/java-0343.html
: 但是他只有教排序String Array
: 請問含有String的Object Array應如何排序?
: 請給我一些觀念可以嗎?
: 謝謝

其實如果是這種 object 要排序,而且不是每次都是根據同樣的 member 排序的話

會比較建議做幾個 Comparator, 那麼在不同的時候無論是 sort by index 或是

sort by name, sort by size 都可以做到,只要換一個 Comparator 就可以了。

請參考 Arrays.sort(Object[] a, Comparator c) 函數


--
很多人以為 所以我要 其實我是個快
我是大學生 告訴大家 三十歲的怪叔叔
● ●/ ︿ ︿
/勁\ <勁 ●
ㄨ /\ ㄨ


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 147.8.130.225
※ 編輯: superlubu 來自: 147.8.130.225 (05/19 12:09)
※ 編輯: superlubu 來自: 147.8.130.225 (05/19 12:09)
tsya
2007-05-19 12:58:51 UTC
Permalink
推 PsMonkey:http://pt2wiki.twbbs.org/Wiki.jsp?page=ArraySort  05/19 12:54

抱歉..小弟有一個地方看不懂 Orz

public int compareTo(Object o1){
//物件本身與 o1 相比較,如果 retrun 正值,就表示比 o1 大
if(this.value>((PsObj)o1).value){
return 1;
}else{
return -1;
}
}

請問紅色地方

為何需要刻意宣告是Object

然後cast成PsObj 呢?

我的意思是這樣

public int compareTo(PsObj o1){
if(this.value>(o1.value){
return 1;
}else{
return -1;
}
}

這樣是不是會有什麼問題?

還有延續之前的疑問

排序String就用Comparator

排序Primitive Data Type 就用Comparable或Comparator

這樣結論對嗎?

謝謝你們幫忙

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.132.132.7
小安
2007-05-19 14:03:29 UTC
Permalink
※ 引述《tsya (tsya)》之銘言:
: public int compareTo(Object o1){
: }
: 請問紅色地方
: 為何需要刻意宣告是Object
: 然後cast成PsObj 呢?
: 我的意思是這樣
因為這只是個 Interface,
在設計 Interface 的時候不知道使用者真正要用的哪種物件,

不過自從 1.5 之後增加了 generic,
現在的寫法應該不是這樣了。

: 這樣是不是會有什麼問題?
: 還有延續之前的疑問
: 排序String就用Comparator
: 排序Primitive Data Type 就用Comparable或Comparator
: 這樣結論對嗎?
: 謝謝你們幫忙

完全不對 ~_~

兩者都是用來比較 "物件" 的
只是在 1.5 以後多了 auto-boxing,
所以 Primitive Data Type 會自動 boxing 成 Wrap Object

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.131.65.163
痞子軍團團長
2007-05-19 18:31:52 UTC
Permalink
※ 引述《tkcn (小安)》之銘言:
: ※ 引述《tsya (tsya)》之銘言:
: : public int compareTo(Object o1){
: : }
: : 請問紅色地方
: : 為何需要刻意宣告是Object
: : 然後cast成PsObj 呢?
: : 我的意思是這樣
: 因為這只是個 Interface,
: 在設計 Interface 的時候不知道使用者真正要用的哪種物件,
: 不過自從 1.5 之後增加了 generic,
: 現在的寫法應該不是這樣了。

[攤手] 那已經是五六年前寫的文章了... [逃]
(俺那時候還在用 JDK 1.2 咧 XDXD)
相關的概念自己看 API 修正啦... [狂逃]

: : 這樣是不是會有什麼問題?
: : 還有延續之前的疑問
: : 排序String就用Comparator
: : 排序Primitive Data Type 就用Comparable或Comparator
: : 這樣結論對嗎?
: : 謝謝你們幫忙
: 完全不對 ~_~
: 兩者都是用來比較 "物件" 的
: 只是在 1.5 以後多了 auto-boxing,
: 所以 Primitive Data Type 會自動 boxing 成 Wrap Object

我有點不懂這兩位的討論內容 XD

不過,單純論 Arrays.sort(int[]) 的話
看 1.5 裡頭的 src,是沒有作 boxing 的動作


public static void sort(int[] a) {
sort1(a, 0, a.length);
}

private static void sort1(int x[], int off, int len) {
// Insertion sort on smallest arrays
if (len < 7) {
for (int i=off; i<len+off; i++)
for (int j=i; j>off && x[j-1]>x[j]; j--)
swap(x, j, j-1);
return;
}
//下略... 不過熊熊一看有點看不懂 Orz
}

--
 侃侃長論鮮窒礙  首頁:http://www.psmonkey.idv.tw
 眾目睽睽無心顫  Blog:http://ps-think.blogspot.com
 煢居少聊常人事 
 殺頭容易告白難  歡迎參觀 Java 版(@ptt.cc)精華區 \囧/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.192.4
!H45
2007-05-20 03:03:23 UTC
Permalink
※ 引述《tkcn (小安)》之銘言:
: ※ 引述《tsya (tsya)》之銘言:
: : public int compareTo(Object o1){
: : }
: : 請問紅色地方
: : 為何需要刻意宣告是Object
: : 然後cast成PsObj 呢?
: : 我的意思是這樣
: 因為這只是個 Interface,
: 在設計 Interface 的時候不知道使用者真正要用的哪種物件,
: 不過自從 1.5 之後增加了 generic,
: 現在的寫法應該不是這樣了。

只回這一段, 不需要刻意宣告是 Object 的方法:

public class PsClass implements Comparable<PsClass> {
/**
* 要比較的數值
*/
private int value;

/*
* (non-Javadoc)
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(PsClass arg0) {
return arg0.value - this.value;
}
}

這樣一來,把 compareTo 的參數宣告成 PsClass 來比較就可以了
疑,本討論串首篇不就用了相同的方法嗎?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.205.85
tsya
2007-05-20 05:21:05 UTC
Permalink
因為板大的範例是在1.5之前寫的

所以沒有使用Generics的關係吧

必須用Polymorphism來override那個method

※ 引述《H45 (!H45)》之銘言:
: ※ 引述《tkcn (小安)》之銘言:
: : 因為這只是個 Interface,
: : 在設計 Interface 的時候不知道使用者真正要用的哪種物件,
: : 不過自從 1.5 之後增加了 generic,
: : 現在的寫法應該不是這樣了。
: 只回這一段, 不需要刻意宣告是 Object 的方法:
: public class PsClass implements Comparable<PsClass> {
: /**
: * 要比較的數值
: */
: private int value;
: /*
: * (non-Javadoc)
: *
: * @see java.lang.Comparable#compareTo(java.lang.Object)
: */
: public int compareTo(PsClass arg0) {
: return arg0.value - this.value;
: }
: }
: 這樣一來,把 compareTo 的參數宣告成 PsClass 來比較就可以了
: 疑,本討論串首篇不就用了相同的方法嗎?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.132.132.7

继续阅读narkive:
Loading...