2016-08-08 17 views
-4

Ich arbeite in einem Projekt, das Java 8 verwenden, dieses Projekt ist über einige geographische Informationen zu bekommen und damit arbeiten. Ich habe bereits Teil dieser Arbeit in Python getan, und jetzt bin ich übersetze dieser Teil zu Java in Python hat 8 gut in Python Ich benutze diese Zeilen unten Koordinaten in Google-Format Postgis-Format zu konvertieren:Convert Python zu Java 8

s1 = tuple(value.split(" ")) 
s2 = zip(s1[1::2], s1[::2]) 

zum Beispiel:

ich habe einen Eingang wie: value = "11,1234567912,98765511,343445412,1223323" und so weiter Der Python-Code oben ändert de Eingang: s2 = "12,98765511,1234567912,1223323" und so weiter.

Ändern der Position jedes Koordinatenpaars, jeder Eingang hat Tausende von Koordinaten. Mit meinem Wissen von Java (erworben vor dem Java 8) Ich werde das tun müssen: Um den gleichen Effekt mit Java (vor Java 8) erhalten

try { 
    String result = "", right = "", left = ""; 
    String[] txt = str.split(" "); 
    for (int i = 0; i < txt.length; i += 2) { 
     right = txt[i]; 
     left = txt[i + 1]; 
     result += "," + left + " " + right; 
    } 
    return result.substring(1); 
} catch (ArrayIndexOutOfBoundsException e) { 
    return null; 
} 

Ich werde den Java-Code über tausend Mal ausführen , meine Frage ist: Java 8 hat eine neue Möglichkeit, diesen Code oben mehr wie Python zu machen?

Meine Motivation, diese Frage zu stellen, weil ich auf diese Nachrichten über Java 8 kam:

List<String> someList = new ArrayList<>(); 
// Add some elements 
someList.add("Generic (1.5)"); 
someList.add("Functional (8)"); 

// Open a stream 
someList.stream() 
// Turn all texts in Upper Case 
.map(String::toUpperCase) 
// Loop all elemnst in Upper Case 
.forEach(System.out::println); 

Aktualisierung:

Die Lösung von Jean-François Savard war perfekt Java unter Verwendung von 8 wie ich fragte, vielen Dank Jean-Francois Savard

String str = "11.12345679 12.987655 11.3434454 12.1223323 11.12345679 12.987655 11.3434454 12.1223323"; 
String[] strs = str.split(" "); 
str = IntStream.range(0, strs.length) .filter(i -> i % 2 == 0) .mapToObj(i -> strs[i + 1] + " " + strs[i]) .collect(Collectors.joining(",")); 
System.out.println(str); 
>> 12.987655 11.12345679,12.1223323 11.3434454,12.987655 11.12345679,12.1223323 11.3434454 

Die Lösung von Vampire und Tukayi fit perfectl gezeigt y in meinem Problem, vielen Dank Jungs

String str = "11.12345679 12.987655 11.3434454 12.1223323 11.12345679 
12.987655 11.3434454 12.1223323"; 
str = str.replaceAll("([^\\s]+) ([^\\s]+)(?: |$)", ",$2 $1").substring(1); 
System.out.println(str); 
+1

Vielleicht wäre es einfacher, beispielsweise Ein- und Ausgabe zu zeigen; neben Code zeigen und uns sagen: das ist was passieren soll. Und Tipp: Array außerhalb der Grenzen ignorieren; und null zurückgibt, sieht wie ein Programmfehler aus. Sie wissen, dass Ihre Verarbeitung schief geht (weil Sie etwas falsch machen, oder unerwartete Eingaben) ... und Sie ignorieren das einfach ?! – GhostCat

+1

Ist 'return = resultstring (1);' kompilieren? –

+1

Gibt es eine Chance, dass Sie [jython] (http://www.jython.org/) nutzen könnten? Das ist sicherlich die schnellste Option - keine Konvertierung erforderlich. – miraculixx

Antwort

0

die folgenden in Ihrer Klasse definieren eine RegexMuster in Ihrer Methode

if ((new StringTokenizer(str, " ").countTokens() % 2) == 1) { 
    return null; 
} 
return pattern.matcher(str).replaceAll(",$2 $1").substring(1); 

verwenden

private static final Pattern pattern = Pattern.compile("([^ ]++) ([^ ]++)(?: |$)"); 

Dann vorzukompilieren das gleiche Ergebnis wie in der Original-Code zu erhalten.


Wenn Sie sind abhängig von Verwendung von Streams, warum-o-je, hier eine Lösung Streams

String[] strs = str.split(" "); 
return IntStream.range(0, strs.length) 
       .filter(i -> i % 2 == 0) 
       .mapToObj(i -> strs[i + 1] + " " + strs[i]) 
       .collect(Collectors.joining(",")); 
+0

Ich hörte auf, in Java zu codieren, als es in Version 1.2 war, danach entwickle ich in vielen verschiedenen Sprachen, jetzt sind alle meine alten Java-Codes und Komponenten veraltet, die Streams-Lösung klingt für mich in Zukunft kompatibler, ich mochte auch die Regex-Lösung. Da ich in Systemen arbeite, die für die nächsten Jahre funktionieren müssen, muss ich die Verbesserungen aller Sprachen verwenden, die ich brauche. Mehrmals danke viel Vampir von mir helfen. –

+0

Ich glaube nicht, dass die Regex-Lösung in Zukunft inkompatibel wird. Ich glaube eher, dass die Regex-Lösung länger haltbar und wahrscheinlich auch leistungsfähiger sein wird, aber das ist zu testen. – Vampire

-5

Java 8 hinzugefügt (unter anderem) Lambdas, Streams und funktionale Schnittstellen.

Sie können Streams verwenden, um das Loopen über Objekte zu vereinfachen. Aber die Syntax, die Sie in Python sehen, ist nicht die gleiche wie in Java.

+1

Das ist nicht ohne ein Beispiel hilfreich – SamTebbs33