2017-03-27 4 views
0

Ich bin neu in Java und steckte auf die folgende Aufgabe. Wir arbeiten mit Arrays und sollen basierend auf unserer Eingabe ein Array mit der Länge erstellen. Keine anderen Methoden als main() sind erlaubt.Eingangsarray in geraden und ungeraden Zahlen sortiert

Dann wird das Eingabearray zufällig ganze Zahlen zwischen 0-999 auswählen und sie in das Array setzen, dann sollen wir ein neues Array mit den gleichen Zahlen und Länge erstellen, aber mit geraden Zahlen zuerst und dann ungerade Zahlen sortiert.

Beispiel:

How many variables do you want? 4  

Here are the random variables: 4 7 8 1 
Here are the sorted variables: 4 8 7 1 
Of your chosen variables 2 are even and 2 are odd 

Mein Code so weit ist diese.

public static void main(String[] args) 
{ 
    int checker; 
    int even = 0; 
    int odd = 0; 

    Scanner s = new Scanner(System.in); 

    System.out.print("How many variables between 0-999 you want?: "); 

    int n = s.nextInt(); 

    int arr[] = new int[n]; 
    int ord[] = new int[n]; 

    for(int i = 0; i < n; i++) 
    { 
     arr[i] = (int) (Math.random() * 100) + 1; 
    } 

    System.out.print("Here are your random numbers: "); 

    for(int i : arr) 
    { 
     System.out.print(i + " "); 
    } 

    for(int i = 0; i < n - 1; i++) 
    { 
     checker = arr[i] % 2; 

     if(checker == 0) 
     { 
      even = even + 1; 
     } 
     else 
     { 
      odd = odd + 1; 
     } 
    } 

    System.out.print("Of the chosen numbers" + even + "is even and" + odd + "is odd"); 
} 
+1

Ich denke, Sie sollten speziell sagen, was Sie Probleme haben, und zumindest versuchen, den Sortieralgorithmus. – markspace

+0

Haben Sie Probleme? Wo ist dein Problem? Wenn Sie helfen können, das Problem abzuschwächen, wird es viel glatter sein –

+0

BTW Sie können bitweise und der RMB mit 01 überprüfen, ob die Variable ungerade ist. – TheBlueCat

Antwort

0

Erstens ist arr[i]=(int)(Math.random()*100)+1; falsch. Dies gibt Ihnen eine Zahl im Bereich von 1-100 anstelle von 0-999. Sie müssen es so schreiben:

arr[i]=(int)(Math.random()*1000);

Zweitens ist die Bedingung der letzten Schleife für i<n-1 ist statt i<n. Das muss auch behoben werden.

Nun müssen wir nur das Array sortieren. Wir durchlaufen bereits das Array, um die Anzahl der geraden und ungeraden Zahlen zu zählen, also können wir das Array auch gleichzeitig sortieren.

Lassen Sie uns zwei weitere leere Arrays haben, eine für die geraden Zahlen und eine für die ungeraden Zahlen, in denen wir die Werte zwischenspeichern:

int[] evens = new int[n]; 
int[] odds = new int[n]; 

Nun finden wir jedes Mal eine gerade oder ungerade Zahl, wir sie in eines dieser Felder einfügen können:

if(checker == 0) { 
    evens[even] = arr[i]; //new line of code 
    even = even + 1; 
} else { 
    odds[odd] = arr[i]; //new line of code 
    odd = odd + 1; 
} 

Nun, alles was wir tun müssen, ist, die Werte in diesen beiden Feldern einzufügen, in die endgültige Anordnung ord:

for(int i=0; i<even; i++) { 
    ord[i] = evens[i]; 
} 

for(int i=0; i<odd; i++) { 
    ord[even+i] = odds[i]; 
} 

Und jetzt haben wir das sortierte Array, wie wir wollten.

Jetzt können Sie es drucken, so wie Sie Ihre unsortierten Array gedruckt:

System.out.print("Here are the sorted variables:"); 
for(int i : ord) { 
    System.out.print(i + " "); 
} 
0

ich es sehen einige Leute schlagen mich, aber ich werde Sie auf jeden Fall ein paar Ratschläge beantworten und geben.

Dies ist der Code, den Sie hinter Ihrer letzten for-Schleife hinzufügen sollten.

int iEven=0;  // the even part starts at the beginning 
    int iOdd=even; // the odd part starts where the even one ends 
    for(int i=0; i<n; i++){ 
     if(arr[i] % 2 == 0){ 
      ord[iEven] = arr[i]; 
      iEven++; 
     }else{ 
      ord[iOdd] = arr[i]; 
      iOdd++; 
     } 
    } 

    System.out.print("\nHere are the sorted variables: "); 
    for(int i:ord){ 
     System.out.print(i+" ");  
    } 

Was es tut, ist es setzt die geraden Zahlen am Anfang des Arrays und die, wo die geraden enden.

Sie sollten auch Ihre For-Schleife reparieren: 'für (int i = 0; i < n - 1; i ++)'. In diesem Fall wird es weniger als einmal ausgeführt. Entweder setzen 'i < = n-1' oder 'i < n' oder die beste Option ist ‚i < Array zu verwenden.Länge ' und es wird sich ändern, wenn Sie das Array ändern, und Sie müssen sich nicht sorgen, es jedes Mal zu ändern.

Und jetzt Beratung ... Schreiben Sie den Code wie folgt aus:

checker = arr [i]% 2; if (checker == 0)

kann wie folgt verbessert werden:

if (arr [i]% 2 == 0)

und es sieht viel schöner. Es spart ein wenig Tipp

andere Sache, die leichter machen wird die Programmierung für Sie mit i ++ (oder i--) für eine Variable um 1 erhöht wird. Oder wenn Sie um mehr erhöhen möchten, verwenden Sie i + = 3 oder i- = 7.

this helps

+0

Gute Antwort. "I" ist jedoch bereits auf die Länge des Arrays festgelegt. Es hat keinen Sinn, "arr.length" statt "n" zu schreiben. – Gendarme

0

Die beste Lösung ist Ihre eigene Hand zu schreiben: Vergleichen Sie zuerst, wenn sie eine gerade und die andere ungerade. Wenn sie dir schon bekannt sind, welcher zuerst gehen soll, ansonsten vergleiche dann natürlich.

Integer ord[] = new Integer[n]; 
Arrays.asList(arr).stream().sorted(new Comparator<Integer>() { 
             @Override 
             public int compare(Integer o1, Integer o2) { 
              if (o1 % 2 == 0 && o2 % 2 == 1) { 
               return -1; 
              } else if (o1 %2 == 1 && o2 % 2 == 0) { 
               return 1; 
              } 
              return o1.compareTo(o2); 
             } 
            }).collect(Collectors.toList()).toArray(ord); 
+1

Ich würde das überkomplizierende Dinge nennen. Auch das ursprüngliche Poster sagte, dass keine andere Methode als 'main()' erlaubt war, also nehme ich an, dass 'compare()' hier ein Nogo ist. –

0

Sie können dies leicht genug tun, indem Sie Ihre letzte Schleife ändern. Der Schlüssel ist, das Array mit geraden Zahlen von vorne und mit ungeraden Zahlen von hinten zu füllen. Und wenn Sie fertig sind, sagt Ihnen der even Index, wie viele gerade Zahlen es gibt. Gefällt mir:

int even = 0; 
int odd = n-1; 
for(int i = 0; i < n; i++) 
{ 
    checker = arr[i] % 2; 

    if(checker == 0) 
    { 
     // even numbers fill from 0, forward 
     ord[even] = arr[i]; 
     ++even; 
    } 
    else 
    { 
     // odd numbers fill from n-1, backward 
     ord[odd] = arr[i]; 
     --odd; 
    } 
} 

System.out.print("Of the chosen numbers" + even + "is even and" + (n-even) + "is odd"); 
Verwandte Themen