2016-06-21 8 views
0

Was ich hier getan, um den Inhalt der Tabelle unten entnommen und diese in einer Liste tableElemsDruckmuster aus der Liste in Java

0 1 2 3 4 5 6 7 8 
9 10 11 12 13 14 15 16 17 
18 19 20 21 22 23 24 25 26 
27 28 29 30 31 32 33 34 35 

List<WebElement> tableElems = chrome.findElements(By.tagName("td")); 

Aus dieser Tabelle Ich möchte in einem Muster an dem Start drucken genannt gespeichert 4. Element (# 3 in der Tabelle) und ich möchte 3 Elemente drucken, dann die nächsten 6 überspringen, die nächsten 3 ausdrucken und dann die nächsten 6 usw. überspringen.

Also meine erwartete Ausgabe wäre 3 4 5 12 13 14 21 22 23 30 31 32

Mein erster Versuch endete mit

for (int i = 3; i<tableElems.size(); i++) { 
      if(i % 3 == 0) { System.out.println(tableElems.get(i).getText()); } 
      else if(i % 4 == 0) { System.out.println(tableElems.get(i).getText()); } 
      else if(i % 5 == 0) { System.out.println(tableElems.get(i).getText()); } 
     } 

Offensichtlich ist dies falsch, weil mein % 3 das neunte Element drucken, % 4 das 16. Element zu drucken, usw.

ich Probleme Einwickeln meinen Kopf um das habe, so einen Rat, mich zu zeigen in die richtige Richtung wird geschätzt!

+0

tableElems wirkt wie Array? –

+0

@Ali tableElems ist eine Liste. Ich werde es oben einschließen. Ich verwende Selen-Webdriver, um die Werte aus einer Tabelle zu ziehen. –

+0

du brauchst etwas likke (für (i = 4; i <= myList.length; I = 9) {... ich bin jetzt dein Startindex) Ich versuche jetzt in Java umzuschreiben –

Antwort

1

versuchen, dies:

for (int i = 3; i<tableElems.size(); i++) { 
    if (((i/3) % 3) == 1) { System.out.println(tableElems.get(i).getText()); } 
} 

darüber nachdenken, wie in Gruppen von neun unterteilen, und ferner jede Gruppe von 9 in Gruppen von 3 auf der zweiten Gruppe von 3 (dh 3-5 Dividieren , 12-14) wird angezeigt.

+0

Das gab mir eine unendliche Schleife von Vierern. Ich mag diesen Ansatz jedoch - ich kann versuchen, es zu verbessern, wenn Sie es nicht überarbeiten. –

+0

Ich bin nicht sicher, wie es möglich ist, 4 mehr als einmal zu drucken - durch die Art der for-Schleife. Probieren Sie System.out.println (i); und sehen, ob die Indizes funktionieren? – hujasonx

+0

Unendliche Schleife von 3, sorry. –

0

Update: Java-Code

for (int i = 3; i<tableElems.size(); i += 9) { 
    System.out.println(tableElems.get(i).getText()); 
    System.out.println(tableElems.get(i+1).getText()); 
    System.out.println(tableElems.get(i+2).getText()); 
    System.out.println(tableElems.get(i+3).getText()); 
} 

Wenn Sie ein größeres Muster erstellen:

int starting = 3; 
int nextStartDistance = 9; 
int waveCount = 3; 

for (int i = starting; i<tableElems.size(); i += nextStartDistance) { 
    for (int b = 0; b <= waveCount; b ++) { 
     System.out.println(tableElems.get(i).getText()); 
    } 

} 

Dieser Code ist in JavaScript geschrieben, aber der Algorithmus berücksichtigt:

var list =[ 
0,1,2,3,4,5,6,7,8, 
9,10,11,12,13,14,15,16,17, 
18,19,20,21,22,23,24,25,26, 
27,28,29,30,31,32,33,34,35]; 

for (var index = 3; index <= list.length; index +=9) { 
    var a = list[index]; 
    var b = list[index+1]; 
    var c = list[index+2]; 
    var d = list[index+3]; 
    console.log(a,b,c,d); 
} 

Ergebnis wird sein, was Sie erwartet haben:

// 3 4 5 6 
// 12 13 14 15 
// 21 22 23 24 
// 30 31 32 33 
// user:~$ 
+0

Hallo - danke für die Antwort. Mein Tisch ist eigentlich viel viel größer als das. Es gibt ungefähr 500 Einträge in dieser Tabelle, ich habe sie einfach verkleinert, um den Punkt des Musters zu beweisen, für das ich vorgehe. –

+0

Dieses Muster hat funktioniert? –

1
int offset = 4; 
int width = 3; 

Rat:

für jede Zeile in Tabelle Rückschlag Offset + Breite unter der Zeilenbreite, und dann von Offset + 0, Offset + 1 beginnen, bis Offset + Breite

und weiter Diese Schleife für die ganze Reihe der Tabelle

1

Sie erwähnten, dass tableElems eine Liste ist, also nehme ich an, dass es einem eindimensionalen Array ähnlich ist, anstatt wie eine mehrdimensionale Tabelle zu erscheinen (Ich nehme an, für visuelle Zwecke).

Sie haben recht, indem Sie die für Schleife bei i = 3 starten. Der einfachste Weg, IMO, dies zu tun, ist nur die Schleife mehrere Felder im Array nach dem Sie drei Elemente gedruckt haben. Hier ist meine Lösung mit C# und einem Array; Sie sollten es ziemlich einfach in Java konvertieren können.

int counter = 0; 
for (int i = 3; i < array.Length; i++) 
{ 
    if (counter < 3) 
    { 
     Console.WriteLine(array[i]); 
     counter++; 
    } 
    else 
    { 
     i += 5; // we are incrementing by one on the next pass, so this can be 5 
     counter = 0;  
    }  
} 
+0

Ja, Ihre Annahme, dass es eindimensional ist, ist richtig. –

+0

Woher kommt 'Console.WriteLine'? –

+0

Console.WriteLine() wird von C# verwendet, um auf die Konsole zu schreiben. Es ist funktional äquivalent zu Java System.out.println(). OP hatte Java angegeben, also gestehe ich, dass ich es schon geschrieben hatte und ich fühlte mich etwas faul in Bezug darauf, es selbst zu konvertieren :) –

1

Wenn Sie % halten wollen, dann sollten diese dies zu Ihrem Code wäre ich denke

int rowSize = 9; 
for (int i = 0; i < tableElems.size(); i++) { 

    int column = i % rowSize; 

    if (column >=3 && column <= 5) { 
     System.out.println(tableElems.get(i).getText()); 
    } 
} 
+0

Warum Schleife von 0, wenn wir wissen, OP möchte mit 4. Element beginnen? –

+0

Ich habe es gerade so gemacht, dass es eher wie eine allgemeine Lösung aussieht. Es ist also ein bisschen einfacher, sich an andere Indizes anzupassen. –

+0

Ihr Algorithmus wird 36-mal iterieren, ein Algorithmus, bei dem nur 12 Iterationen passieren würden, existiert. –

0
for (int i = 3; i < tableElems.size(); i += 9) { 
    for (int j = i; j < i + 3 && j < tableElems.size(); j++) { 
     System.out.println(tableElems.get(j).getText()); 
    } 
} 
0

arbeiten ganz in der Nähe:

for (int i = 3; i < tableElems.size(); i++) { 
     if (i % 3 == 0) { 
      System.out.println(tableElems.get(i).getText()); 
     } else if ((i % 3) == 1) { 
      System.out.println(tableElems.get(i).getText()); 
     } else if ((i % 3) == 2) { 
      System.out.println(tableElems.get(i).getText()); 
      i = i + 6; 
     } 
    } 

i Ihre Modulo nur angepasst und Überspringe 6 Elemente jedes Mal, wenn ich die letzte anspringe, um

auszudrücken, außerdem ist es ziemlich effe ctive, weil alle nicht benötigten Elemente einfach übersprungen statt iteriert und überprüft werden

0

Angenommen, Sie nur für die Werte aus Ihrer Tabelle und die HTML-Struktur ist Standard-HTML-Tags wie auf Ihren Fragen gezeigt, dann können Sie mit CSS-Selektor auswählen geeignete Werte.

chrome.findElements(By.cssSelector("td:nth-child(4),td:nth-child(5), td:nth-child(6)")) 

Bitte beachten Sie, dass css Nth-Kind-Selektor 1 basiert ist.

Verwandte Themen