2016-08-08 3 views
-4

Я работаю над проектом, использующим java 8, этот проект предназначен для получения некоторой географической информации и работы с этим. я уже сделал часть этой работы в Python, и теперь я перевожу эта часть сделала в Python для Java 8, а в Python Я использую эти строки ниже для преобразования координат в формате Google в формат PostGIS:Преобразование Python в Java 8

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

Например:

у меня есть вход как: значение = "+11,1234567912,98765511,343445412,1223323" и так далее Питон выше код изменяет де вход: s2 = «12,98765511,1234567912,1223323» и так далее.

Изменение положения каждой пары координат, каждый вход имеет тысячи координат. Чтобы получить тот же эффект с Java (до Java 8): Используя свои знания Java (приобретенный до Java 8) мне нужно будет сделать:

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; 
} 

выполнит код Java выше тысяч раз , мой вопрос: Java 8 имеет новый способ сделать этот код выше, чем Python?

Моя мотивация задать этот вопрос, потому что я наткнулся на эту новость о Java 8:

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); 

Обновление:

Решение Жан-Франсуа Савар был совершенным с использованием Java 8, как Я спросил, спасибо так много Жана-Франсуа Савара

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 

решения показано вампиром и Tukayi подходит perfectl y в моей проблеме, большое спасибо ребятам

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

Может, было бы проще, чтобы показать пример ввода и вывода; кроме того, показывая код и рассказывая нам: вот что должно произойти. И подсказка: игнорирование массива вне границ; и просто возврат null выглядит как ошибка. Вы знаете, ваша обработка идет не так (потому что вы делаете что-то неправильно или неожиданно вводите) ... и вы просто игнорируете это ?! – GhostCat

+1

Является ли 'return = result.substring (1);' собирается компилироваться? –

+1

Есть ли шанс, что вы могли бы использовать [jython] (http://www.jython.org/)? Это, безусловно, самый быстрый вариант - никакого преобразования не требуется. – miraculixx

ответ

0

Определите следующее в своем классе прекомпилировать регулярное выражение

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

Тогда в вашем методе используют

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

, чтобы получить тот же результат, как и в исходном коде.


Если вы зависите с использованием потоков почему-о-нибудь, здесь решение 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

Я прекратил кодирование в java, когда он был в версии 1.2, после этого я развиваюсь во многих разных языки, теперь все мои старые коды и компоненты Java устарели, решение Streams звучит для меня как более совместимое в будущем, мне также понравилось решение Regex. Поскольку я работаю в системах, которые должны функционировать в течение следующих лет, я должен использовать усовершенствования всех языков, которые мне нужны для работы. Еще один раз спасибо вампиру, помогите мне. –

+0

Я не думаю, что решение regex станет несовместимым в будущем. Я больше думаю, что решение регулярных выражений будет более продолжительным и, вероятно, более эффективным, но это нужно протестировать. – Vampire

-5

Java 8 добавлено (между прочим) Lambdas, потоки и функциональные интерфейсы.

Вы можете использовать потоки, чтобы упростить цикл по объектам. Но синтаксис, подобный тому, который вы видите в Python, не то же самое, что и в java.

+1

Это не полезно без примера – SamTebbs33