2017-11-04 3 views
-3

Problem: Ich habe eine bestimmte Sortiermethode verwendet, aber es hat nicht so funktioniert, wie ich es erwartet hatte und ich verstehe nicht, wo ich mich möglicherweise irrte.Warum kann meine Sortiermethode für Bigdecimal-Zahlen nicht sortiert werden?

Mein Code nahm Eingang (die Zahlen sind) als Saiten in ein String-Array und dann konvertiert sie in BigDecimal Zahlen, während ich sie verglichen werden, und sie dann als Zeichenfolgen entsprechend in dem Array umgeordnet

der Code in Frage:

String s[]={-100, 50, 0, 56.6, 90, 0.12, .12, 02.34, 000.000}; 

    for(int i=0;i<n-1;i++) 
     { 
      for (int j =i+1; j<n; j++) 
      { 
       BigDecimal d = new BigDecimal(s[j]); 
       BigDecimal a = new BigDecimal(s[i]); 
       if(a.compareTo(d)==-1) 
        { 
         String m = s[j]; 
         s[j]=s[i]; 
         s[i]=m; 
        } 
       } 
     } 
     //output :90, 56.6, 50, 02.34, .12, 0.12, 0, 000.000, -100 

     //expected output :90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100 

Constraints: s[n] sollte ein String-Array sein und wenn zwei Eingänge gleiche Werte haben sie sollten wir sie eingegeben in dem Array in derselben Reihenfolge aufgeführt werden.

ich verstehe nicht, warum 0.12 und .12 nicht in der gleichen Reihenfolge ausgegeben werden, wie ich sie eingegeben habe, wenn der Algorithmus irgendwo falsch ist, auch 0 und 000.000 hätten nicht in der gleichen Reihenfolge erscheinen sollen wie ich sie eingegeben habe , aber stattdessen taten sie es.

+7

Warum Ihr String Array enthalten Strings nicht? – byxor

+0

eigentlich ist es die Frage Einschränkung, dass Zahlen als Strings eingegeben werden müssen –

+0

Ich denke, Sie sollten sie in "" umgeben, um sie String-Literale (zB '{" -100 "," 50 "'). Vielleicht Ich verpasse hier eine Art von fancy Java-Syntax, aber es bläst mir, dass dies kompiliert – byxor

Antwort

3

Nun, da Sie String-Nummern verwenden möchten, müssen Sie sie in Anführungszeichen umbrechen, aber Ihre Sortierung kann viel besser lesbar sein. Ich würde vorschlagen, die folgenden

String[] numbers ={"-100", "50", "0", "56.6", "90", "0.12", ".12", "02.34", "000.000"}; 
    List<BigDecimal> decimalList = new ArrayList<>(); 
    for(String s: numbers){ 
     decimalList.add(new BigDecimal(s)); 
    } 
    Collections.sort(decimalList); 
    Collections.reverse(decimalList);  // edit , forgot this line 
    decimalList.forEach(System.out::println); 
+0

Das ist definitiv die bessere Antwort für einen Neuling, weil jeder Schritt klarer wird - egal, dass mehr Zeichen verwendet werden. Am Ende zählt, dass der Code lesbar und damit leichter zu verstehen ist. –

3

Sie ein Stream verwenden und einen benutzerdefinierten Komparator sorted und dann collect und Druck passieren. Wie,

String s[] = { "-100", "50", "0", "56.6", "90", "0.12", ".12", "02.34", "000.000" }; 
System.out.println(Stream.of(s) 
     .sorted((a, b) -> new BigDecimal(b).compareTo(new BigDecimal(a))) 
     .collect(Collectors.joining(", "))); 

Und ich (wie gewünscht)

90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100 
+0

Glaubst du, dass das besser lesbar ist als die Antwort von Stefan? –

+0

@ThomasS. Ich denke, es ist besser lesbar, Druck WHAT OP fragte nach und sortiert richtig (wenn wir die Ergebnisse sind zu vergleichen, Stefan produziert '-100, 0, 0.000, 0,12, 0,12, 2,34, 50, 56,6, 90 '- was nicht stimmt). –

+1

Upvoted Ihre Antwort, weil es das volle Potenzial von Java 8 Funktionen und weniger Code nutzt. Ich denke, meiner ist besser lesbar für Einsteiger-Coder, bearbeitet um korrekte Ergebnisse zu produzieren. – Stefan

Verwandte Themen