Чаму мае аб'екты, якія рэалізуюць супастаўных адсартаваныя?

мой просты прыклад (укладальнік працоўнага кода) проста не сартаваць садавіна па іх вазе.

import java.util.Arrays;

public class Test {

    public static class Fruit implements Comparable {
        public int weight = 0;
        public Fruit(int w) { weight = w; }
       //compare this fruit to a given fruit f
        public int compareTo(Fruit f) {
            return (weight > f.weight) ? 1 : 0;
        }
    }

    public static void main(String[] args) {

       //get some fruits (we intentionally create a box for 100 fruits)
        Fruit[] fruits = new Fruit[100];
        for (int i = 0; i < 10; i++) {
            fruits[i] = new Fruit((int)(Math.random() * 50 + 1));
        }

       //sort fruits by weight
        Arrays.sort(fruits, 0, 10);

       //print fruit weights
        for (int i = 0; i < 10; i++) {
            System.out.print(fruits[i].weight + " ");
        }

    }

}

Чаму гэта так?

Добра, у маёй праблеме (не пра садавіну), у мяне ёсць аб'екты, якія ніколі не парамі роўныя, таму я думаў, што адзін аб'ект можа быць больш або менш, чым іншы. Так як я магу справіцца з гэтай сітуацыяй, калі я ведаю, што 0 (аб'екты аднолькавыя) ніколі не адбудзецца?

3
калі рэалізаваць аперацыю CompareTo правільна (гл ніжэй адказаў) і, па азначэнні, два значэння не будуць роўныя, CompareTo не толькі ніколі не вяртаць 0 - няма неабходнасці спецыяльна апрацоўваць тое, што не адбудзецца. А калі - па нейкіх прычынах - гэта адбудзецца праз некаторы час, ваша здагадка будзе няправільным, але рэалізацыя па-ранейшаму з'яўляецца правільнай (калі CompareTo затым вяртае 0). Ніякага шкоды не зроблена, ці не так?
дададзена аўтар Olaf Kock, крыніца
калі рэалізаваць аперацыю CompareTo правільна (гл ніжэй адказаў) і, па азначэнні, два значэння не будуць роўныя, CompareTo не толькі ніколі не вяртаць 0 - няма неабходнасці спецыяльна апрацоўваць тое, што не адбудзецца. А калі - па нейкіх прычынах - гэта адбудзецца праз некаторы час, ваша здагадка будзе няправільным, але рэалізацыя па-ранейшаму з'яўляецца правільнай (калі CompareTo затым вяртае 0). Ніякага шкоды не зроблена, ці не так?
дададзена аўтар Olaf Kock, крыніца

11 адказы

compareTo must return one of 3 values:

  • >0 --> Bigger than

  • 0 --> Equal

  • <0 --> Less than

Ваш CompareTo метад вяртае толькі 0 або 1 ; выправіць.

7
дададзена
= 1. Ня правільна. <�Код> CompareTo() можа вяртаць любой Int значэнне.
дададзена аўтар Bohemian, крыніца
Што больш, чым што? Я прапусціў гэта абсалютна.
дададзена аўтар Sophie Sperner, крыніца
+1 любы станоўчае ці адмоўнае лік, каб быць дакладным ..
дададзена аўтар Anirudha, крыніца
@Anirudh выправіў, дзякуй.
дададзена аўтар SJuan76, крыніца
1 -> Гэты аб'ект больш (ці пасля, калі вы хочаце, каб правапіс) адзін перадаецца ў якасці параметру.
дададзена аўтар SJuan76, крыніца

compareTo must return one of 3 values:

  • >0 --> Bigger than

  • 0 --> Equal

  • <0 --> Less than

Ваш CompareTo метад вяртае толькі 0 або 1 ; выправіць.

7
дададзена
= 1. Ня правільна. <�Код> CompareTo() можа вяртаць любой Int значэнне.
дададзена аўтар Bohemian, крыніца
Што больш, чым што? Я прапусціў гэта абсалютна.
дададзена аўтар Sophie Sperner, крыніца
+1 любы станоўчае ці адмоўнае лік, каб быць дакладным ..
дададзена аўтар Anirudha, крыніца
@Anirudh выправіў, дзякуй.
дададзена аўтар SJuan76, крыніца
1 -> Гэты аб'ект больш (ці пасля, калі вы хочаце, каб правапіс) адзін перадаецца ў якасці параметру.
дададзена аўтар SJuan76, крыніца

compareTo must return one of 3 values:

  • >0 --> Bigger than

  • 0 --> Equal

  • <0 --> Less than

Ваш CompareTo метад вяртае толькі 0 або 1 ; выправіць.

7
дададзена
= 1. Ня правільна. <�Код> CompareTo() можа вяртаць любой Int значэнне.
дададзена аўтар Bohemian, крыніца
Што больш, чым што? Я прапусціў гэта абсалютна.
дададзена аўтар Sophie Sperner, крыніца
+1 любы станоўчае ці адмоўнае лік, каб быць дакладным ..
дададзена аўтар Anirudha, крыніца
@Anirudh выправіў, дзякуй.
дададзена аўтар SJuan76, крыніца
1 -> Гэты аб'ект больш (ці пасля, калі вы хочаце, каб правапіс) адзін перадаецца ў якасці параметру.
дададзена аўтар SJuan76, крыніца

Выкарыстоўвайце метад адкрытыя статычныя INT параўнаць (цэлае х, Int у) з класа java.lang.Integer (з Java 7).

public int compareTo(Fruit f) {
    return Integer.compare(weight, f.weight);
}
4
дададзена
+1 выкарыстоўваць бібліятэкі!
дададзена аўтар assylias, крыніца

Калі вага ніколі не адмоўная, то вы можаце паспрабаваць

return weight - f.weight; 

замест

return (weight > f.weight) ? 1 : 0;

сартаваць ад самага нізкага да самага высокага значэння.

3
дададзена
Мне падабаецца ваша рашэнне, таму што зваротнага вага - f.weight значна прасцей, чым вяртанне Integer (у вазе . Як вы ведаеце, у маіх садавіне праекта ніколі не роўныя, як я магу выкарыстоўваць гэты факт, каб прадухіліць вяртанне 0 ?
дададзена аўтар Sophie Sperner, крыніца
@Pshemo У кантэксце садавіны, ды я думаю. Але гэта можа прывесці да дзёрзкім памылак, так што я заўсёды трохі неахвотна выкарыстоўваюць гэты метад.
дададзена аўтар assylias, крыніца
@SophieSperner вяртанне (х <�у)? -1: ((х == у) 0: 1); гэта правільны спосаб зрабіць гэта.
дададзена аўтар assylias, крыніца
Гэта добра працуе, калі ўсе лічбы, як чакаецца, будзе станоўчым і/або малым. Але -3 - Integer.MAX_VALUE будзе памылкова вяртае станоўчае лік, напрыклад.
дададзена аўтар assylias, крыніца
@assylias Так, мой адказ не будзе правільным у выпадку, калі лік можа быць таксама адмоўным. Я абнавіў свой адказ, каб прадухіліць, што выкарыстанне для будучага чытача.
дададзена аўтар Pshemo, крыніца
@assylias Праўда, але я лічу, што мы можам выказаць здагадку, што вага не можа быць адмоўным, так што для станоўчых лікаў вага - f.weight будзе працаваць нармальна. У іншым выпадку Integer.compare (вага, f.weight); будзе лепшым варыянтам.
дададзена аўтар Pshemo, крыніца
@SophieSperner Калі вага садавіны заўсёды <�код >> = 0 і ўсё вагі розныя, то вы вага - f.weight ніколі не будзе вяртаць 0. Але ў вашым прыкладзе пладоў можа мець тое ж самае вага, так што я сапраўды не ведаю, як адказаць на ваш каментар.
дададзена аўтар Pshemo, крыніца

Лепшы падыход заключаецца ў выкарыстанні JDK якая пастаўляецца метад для параўнання Int значэння, што таксама робіць яго крышталёва ясна, што код робіць

public int compareTo(Fruit f) {
    return Integer.compare(weight, f.weight);
}

Да версіі 7 Явы, у вас ёсць два варыянты:

public int compareTo(Fruit f) {
    return weight - f.weight;//terse, but slightly obtuse
}

public int compareTo(Fruit f) {
    return new Integer(weight).compareTo(f.weight);//ugly, but supposedly clear
}

Я аддаю перавагу адніманне, таму што як толькі вы зразумееце гэта, гэта ясна з тых часоў.

2
дададзена
@SophieSperner кажа вам ... Java будзе ў лінію гэта аднімання праз JIT. Гэта самы яскравы код, і разлічвае на многае.
дададзена аўтар Bohemian, крыніца
@SophieSperner Гэта ясна, калі вы знаёмыя з шаблонам, але калі няма, то можа быць загадкавым для Яе. Выразнасць вельмі важная. Акрамя таго, калі вы заказвалі ў адваротным кірунку, f.weight - вага вельмі падобны шукае код, але -Integer.compare (вага, f.weight) зразумелай.
дададзена аўтар Bohemian, крыніца
@assylias Не быўшы абарончым, але ... Ваш каментар выпадак, каб дазволіць догме замяніць ваш мозг: А) вага не можа быць адмоўным, і B), калі чаканы дыяпазон значэнняў нават прыходзіць на працягу некалькіх парадкаў макса Int , вы б выкарыстоўваць доўгі , так што ў гэтым кантэксце простага адніманне цалкам прымальна. І вы гэта ведаеце :) Вы заўсёды павінны мець на ўвазе, дзе ваш код, так што вы можаце ўжыць яго найпростыя бяспечнае рашэнне, якое працуе.
дададзена аўтар Bohemian, крыніца
Няма Integer.compare не з'яўляецца лепшым, таму што укладзены выклік параўнаць гэта дзярмо, асабліва для параўнання цэлых лікаў.
дададзена аўтар Sophie Sperner, крыніца
<�Код> вага - f.weight больш зразумелай.
дададзена аўтар Sophie Sperner, крыніца
@Bohemian Да да да ...
дададзена аўтар assylias, крыніца
Адніманне працуе добра, калі ўсе лічбы, як чакаецца, будзе станоўчым і/або малым. Але -3 - Integer.MAX_VALUE будзе памылкова вяртае станоўчае лік, напрыклад.
дададзена аўтар assylias, крыніца

Лепшы падыход заключаецца ў выкарыстанні JDK якая пастаўляецца метад для параўнання Int значэння, што таксама робіць яго крышталёва ясна, што код робіць

public int compareTo(Fruit f) {
    return Integer.compare(weight, f.weight);
}

Да версіі 7 Явы, у вас ёсць два варыянты:

public int compareTo(Fruit f) {
    return weight - f.weight;//terse, but slightly obtuse
}

public int compareTo(Fruit f) {
    return new Integer(weight).compareTo(f.weight);//ugly, but supposedly clear
}

Я аддаю перавагу адніманне, таму што як толькі вы зразумееце гэта, гэта ясна з тых часоў.

2
дададзена
@SophieSperner кажа вам ... Java будзе ў лінію гэта аднімання праз JIT. Гэта самы яскравы код, і разлічвае на многае.
дададзена аўтар Bohemian, крыніца
@SophieSperner Гэта ясна, калі вы знаёмыя з шаблонам, але калі няма, то можа быць загадкавым для Яе. Выразнасць вельмі важная. Акрамя таго, калі вы заказвалі ў адваротным кірунку, f.weight - вага вельмі падобны шукае код, але -Integer.compare (вага, f.weight) зразумелай.
дададзена аўтар Bohemian, крыніца
@assylias Не быўшы абарончым, але ... Ваш каментар выпадак, каб дазволіць догме замяніць ваш мозг: А) вага не можа быць адмоўным, і B), калі чаканы дыяпазон значэнняў нават прыходзіць на працягу некалькіх парадкаў макса Int , вы б выкарыстоўваць доўгі , так што ў гэтым кантэксце простага адніманне цалкам прымальна. І вы гэта ведаеце :) Вы заўсёды павінны мець на ўвазе, дзе ваш код, так што вы можаце ўжыць яго найпростыя бяспечнае рашэнне, якое працуе.
дададзена аўтар Bohemian, крыніца
Няма Integer.compare не з'яўляецца лепшым, таму што укладзены выклік параўнаць гэта дзярмо, асабліва для параўнання цэлых лікаў.
дададзена аўтар Sophie Sperner, крыніца
<�Код> вага - f.weight больш зразумелай.
дададзена аўтар Sophie Sperner, крыніца
@Bohemian Да да да ...
дададзена аўтар assylias, крыніца
Адніманне працуе добра, калі ўсе лічбы, як чакаецца, будзе станоўчым і/або малым. Але -3 - Integer.MAX_VALUE будзе памылкова вяртае станоўчае лік, напрыклад.
дададзена аўтар assylias, крыніца

Ваш CompareTo метад павінен вяртаць -1, 0, 1

LESSER = -1;
EQUAL = 0;
BIGGER = 1;
0
дададзена

Ваш CompareTo метад павінен вяртаць -1, 0, 1

LESSER = -1;
EQUAL = 0;
BIGGER = 1;
0
дададзена

Ваш CompareTo метад павінен вяртаць -1, 0, 1

LESSER = -1;
EQUAL = 0;
BIGGER = 1;
0
дададзена

Ваш CompareTo метад павінен вяртаць -1, 0, 1

LESSER = -1;
EQUAL = 0;
BIGGER = 1;
0
дададзена