2016-12-11 1 views
-1

Mein Ziel ist es, ein Array von 22 Elementen zu erstellen, in denen 11 Elemente "G" und 11 Elemente "B" sein müssen. Jedes fünfte Element in dem Array ist "B".Java - Einfügen eines Elements nach jedem n Elemente in einer ArrayList

Das fünfte Element im Array ist B, das 10. ist B, das 15. ist B und 20. ist B. Das Array sollte nach dem letzten Element umbrechen und die vorhandenen B-Elemente überspringen, daher das nächste B ist das 3. Element, gefolgt vom 9. Element und so weiter.

Bisher ist dies mein Code und aktuelle Ausgangs:

private static ArrayList<String> circle; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    circle = new ArrayList<String>(); 

    for(int i=0; i< 22; i++){ 
     circle.add("G"); 
    } 

    for(int i=0; i<circle.size(); i++){ 
     if((i+1) % 5 == 0){ 
      circle.set(i, "B");    
     } 
    } 
    for(int i=0; i<circle.size(); i++){ 
     System.out.printf("%3d", (i+1)); 
    } 
    System.out.print("\n"); 
    for(int i=0; i<circle.size(); i++){ 
     System.out.printf("%3s", circle.get(i)); 
    } 

} 
/* Output */ 
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
    G G G G B G G G G B G G G G B G G G G B G G */ 

Die gewünschte Ausgabe ist

/* Desired Output */ 
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
    B G B G B B G B G B B G B G B G G B G B G G */ 

Wie kann ich über sie gehen? Danke!

+2

Ich finde die Frage unklar, besonders der Teil, der beginnt "Danach ist das nächste fünfte Element (21,22,1,2,3) ...". Es ist auch keine gute Idee, Ihre Variable mit einem Großbuchstaben zu benennen (es sei denn, es handelt sich um eine Konstante, in diesem Fall sollten es Großbuchstaben sein). Weitere Informationen finden Sie unter [Java Naming Conventions] (http://www.oracle.com/technetwork/). java/codeconventions-135099.html) –

+0

@DB Ich habe einen Beitrag zum Beitrag gemacht, der zur Klärung beitragen sollte. Ich stimme der Namenskonvention zu - zuerst dachte ich: Circle = ArrayList <> 'war ein Tippfehler! Für alle anderen - meld es nicht ab, bis die Frage bearbeitet wurde! – CJxD

+0

Hallo! Entschuldigung für die Verwirrung und danke für die Bearbeitung CJxD. @ J.Baoby Wenn die Arraylist 11 "B" s hat. – user3397557

Antwort

1
int max = 22; 
    int count = 0; // count number of B's 
    String x[] = new String[22]; 
    int i = 4; // starting index 
    while (count < 11) { 
     x[i] = "B"; 
     count++; 
     int c = 0; 
     // we will take five steps to find new index 
     while (c < 5) { 
      i++; 
      i%=22; 
      if(x[i] == "B") ; // dont count it as step if its already B 
      else c++; 
     } 

    } 
    // fill with G 
    for (i = 0; i < 22; i++) { 
     if (x[i] != "B") 
      x[i] = "G"; 
    } 

    System.out.println(Arrays.toString(x)); 

Ausgang

[B, G, B, G, B, G, B, G, B, B, G, G, G, B, B, B, G, G, G, B, G, B] 
1

Hier ist das Schleifenbit wichtig - es ersetzt die for-Schleife, die die Bs in Ihrem ursprünglichen Code setzt.

Es beginnt mit Index 4 (da das erste Element 0 ist, das fünfte Element Index 4).

Dann fügt es jedes Mal nur 5 zu idx hinzu. Die Magie ist der Modulo-Operator, der es umschlingt.

idx:  4 9 14 19 24 29 
idx % 22: 4 9 14 19 2 7 
element: 5 10 15 20 3 8 

garantieren Dies wird nicht Sie 11 Bs für jede Array-Größe haben -, dass Sie nur haben numBs zu erhöhen, wenn das vorherige Element G.

Ausgang war:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
    B G B G B B G B G B B G B G B G G B G B G G 
0

Die von Ihnen gewünschte Ausgabe ist ein bisschen falsch. Nach dem dritten Element ist es das 8th Element, das auf B und nicht auf dem 9. festgelegt werden muss. Diese Schleife sollte genug sein, nachdem Sie Ihre Liste mit „G“ s gefüllt:

for(int i = 1; i <= 11; i++){ 
    circle.set(((i*5)%circle.size()) - 1, "B"); 
} 

Here ist eine Demo des Codes. Wenn Sie möchten, könnten Sie ein Array von Zeichen anstelle einer Liste von Zeichenfolgen verwenden.

Verwandte Themen