2017-05-04 1 views
0

ich die Fare in Form vonWie die Zeichenfolge Arraylist in die Doppel konvertieren, so dass die Arraylist sortierten Wert

C $ 145,19 C $ 298,17, CC $ 398,17, C hat eine Liste der Fluggesellschaft Angebote zurückkehren konnte $ 876.21, C $ 1001.71

und der Deal wird auf der Grundlage des Tarifs von niedrigeren nach höheren sortiert angezeigt.

Ich muss ein Skript erstellen, das diesen Tarif abruft und prüft, ob die Deals auf der Basis des Tarifs von niedriger zu höher erscheinen. Aber ich verwende die Array-Liste als String statt Double.

Wie konvertiert man die String-Arraylist in das Double, damit die Arraylist den sortierten Wert zurückgeben kann?

Code:

ArrayList<String> dealList = new ArrayList<>(); 

List<Webelement> deals = driver.findelements(By.xpath//"div[@class='xyz']"); 
// It pulls out all the Fare with same Xpath which is almost 10 value. 

for(Webelement w: deals) 
{ 
deallist.add(w.gettext()); 
} 

ArrayList<String> newDeaList = new ArrayList<>(); 

for(String s: dealList) 
{ 
newDealList.add(s); 
} 

Collections.sort(newDealList); 
Assert.Assertequals(dealList,newDealList); 

Aber ich bin nicht die richtige Ausgabe zu bekommen.

Ausgangswert:

C $ 145,19 C $ 298,17, CC $ 398,17, C $ 876,21 C $ 1001,71

+0

Sie nicht brauchen, es in eine Reihe zu schalten, und so lange, dass C $ sind in den Werten, kann man auch nicht – Stultuske

+0

Randnotiz: Sie möchten hier ein ** real ** [mcve] bereitstellen. Der Code, den Sie zeigen, gibt keine Hinweise darauf, was vor sich geht. – GhostCat

+0

Auf einer Webseite finden Sie eine Liste mit Flugangeboten, die von bestimmten Reisezielen mit bestimmten Tarifen angezeigt werden. Die Angebote sind bereits nach Tarif sortiert. Ich muss ein Skript dafür erstellen, damit die Deals sortiert werden. Mein Ansatz. Ich habe das Webelement der Typenliste genommen und den Xpath davon gezogen. Dann habe ich die Liste in Array-Liste hinzugefügt und den Wert von gettext gezogen. Jetzt in einer anderen Liste habe ich den gleichen Wert kopiert und collection.sort angewendet, um es zu sortieren und dann beide Listen zu vergleichen, die als die erste Liste bereits zurückgegebene zurückgegebene sortierte Wert – Roy

Antwort

2

Konvertieren von String-Werte in Doppel vollständig here zum Beispiel skizziert. In Ihrem Fall wollen Sie sich mit DecimalFormat beschäftigen - Sie geben ein Muster an, mit dem die "nummerischen" Teile dieser Strings extrahiert werden können.

Darüber hinaus ist es klar, dass ein Vergleich einer Liste von Strings sortiert und eine unsortiert Version dieser Liste in false führen sollte - wie die meisten wahrscheinlich, beide Listen die gleichen Elemente, aber in unterschiedlicher Reihenfolge ! In jedem Fall: Sie könnten immer noch hineingehen und einfach beide Listen iterieren und jeden Eintrag vergleichen, um den zu identifizieren, der die Abweichung verursacht; um dann genauer hinsehen zu können.

Schließlich: und bedenken Sie, dass die Verwendung von Double/Double Währung ist möglich, aber ein No-Go in "realen Welt" -Anwendungen. Fließkommazahlen kommen mit Rundungsfehlern; Daher sollten Sie lieber mit arbeiten.

+0

Bereits die Angebote sind in sortierter Reihenfolge auf der Grundlage des Tarifs auf der Website. Bitte überprüfen Sie den Screenshot – Roy

+0

Welchen Screenshot? – GhostCat

4

würde ich vorschlagen, so etwas wie:

Collections.sort(stringArray, (s1, s2) -> { 
    return Double.valueOf(s1.split('$')[1]) 
     .compareTo(Double.valueOf(s2.split('$')[1])); 
}); 

Alternativ Sie so etwas tun könnte:

Collections.sort(stringArray.stream().map(s -> Double.valueOf(s.split('$')[1]))); 

All dies gesagt wurde, scheinen Sie Gleichheit zweier verschiedenen zu vergleichen Arrays am Ende Ihres Code-Snippets, eine Operation, die immer falsch zurückgibt, da sie die Adressengleichheit vergleicht.

EDIT: (Nach Klärung des Problems - hier ist, wie zwei Arrays auf Gleichheit vergleichen)

boolean compareArrays(List<String> arr1, List<String> arr2) { 
    if (arr1.size() != arr2.size()) { 
     return false; 
    } 
    for(int i = 0; i < arr1.size(); i++) { 
     if (!arr1.get(i).equals(arr2.get(i)) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

Ich sollte den obigen Code nicht ändern. Nur anstelle von Collection & Assert True sollte ich diesen Code integrieren – Roy

+0

Bin ich zu verstehen, dass Ihr Problem Gleichheit zwischen den beiden Arrays überprüft? Oder beim Sortieren? –

+1

Schöne Antwort für einen Neuling, eine Aufwertung wert! Und nur für den Fall, dass Sie beabsichtigen, das neu erworbene Upvote-Privileg zu üben ... Ich bin froh, Ihnen helfen zu können ;-) – GhostCat

0
private boolean ValidateSortedList() { 
    List<String> stringList = new ArrayList<>(); 
    List<Double> pageList = new ArrayList<>(); 

    Collections.addAll(stringList, "C$145.19", "C$298.17", "C$398.17"); 
    System.out.println("deal list in selenium: " + stringList); 

    for (String fareInString : stringList) { 
     int indexOfFare = findIndex(fareInString); 

     Double fareInDouble = Double.parseDouble(fareInString.substring(indexOfFare)); 
     pageList.add(fareInDouble); 
    } 

    List<Double> sortedList = new ArrayList<>(pageList); 

    Collections.sort(sortedList); 
    System.out.println("web page :" + pageList); 
    System.out.println("selenuim test list :" + sortedList); 
    boolean equals = sortedList.equals(pageList); 

    System.out.println("is list equal :" 
      + sortedList.equals(pageList)); 
    return equals; 

} 

private int findIndex(String str) { 
    for (int i = 0; i < str.length(); i++) { 
     char c = str.charAt(i); 
     if (Character.isDigit(c)) { 
      return i; 
     } 
    } 
    return 0; 
} 
+0

zurückgibt. – JDC

+0

Der Code überprüft die Liste ist sortiert oder nicht, –

+0

Danke für die Erinnerung.Hoffnungshilfe –

Verwandte Themen