【问题标题】:Convert Python to Java 8将 Python 转换为 Java 8
【发布时间】:2016-12-14 08:10:23
【问题描述】:

我在一个使用 java 8 的项目中工作,这个项目是关于获取一些地理信息并使用它。 我已经在 python 中完成了部分工作,现在我正在将这部分用 Python 翻译成 java 8,在 Python 中,我使用下面这行代码将 Google 格式的坐标转换为 Postgis 格式:

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

例如:

我有一个入口像:value = "11.12345679 12.987655 11.3434454 12.1223323" 等等 上面的 Python 代码将入口更改为: s2 = "12.987655 11.12345679 12.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);

更新中:

Jean-François Savard 的解决方案是完美的使用 Java 8,就像我问的那样,非常感谢 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

Vampire 和 Tukayi 展示的解决方案非常适合我的问题,非常感谢大家

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

【问题讨论】:

  • 也许显示示例输入和输出会更容易;除了显示代码并告诉我们:这是应该发生的。并提示:忽略数组越界;并且只返回 null 看起来像一个错误。你知道,你的处理出错了(因为你做错了什么,或者意外的输入)......你就忽略了?!
  • return = result.substring(1); 会编译吗?
  • 有没有机会利用jython?这无疑是最快的选择 - 无需转换。
  • 无论如何,您都可以使用您的非Java8知识编写Java代码。我建议你从那里开始,然后尝试应用流和 lambda,如果可以的话
  • 好吧,问题已经结束,所以在这里你可以作为评论: String[] strs = str.split(" "); IntStream.range(0, strs.length) .filter(i -> i % 2 == 0) .mapToObj(i -> strs[i + 1] + " " + strs[i]) .collect(Collectors.joining (","));

标签: java python postgis


【解决方案1】:

在您的类中定义以下内容以预编译正则表达式模式

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,这里有一个 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(","));

【讨论】:

  • 我在 Java 1.2 版本中停止了编码,此后,我正在使用多种不同的语言进行开发,现在我所有的旧 Java 代码和组件都已弃用,Streams 解决方案听起来像将来更兼容,我也喜欢 Regex 解决方案。因为我正在工作的系统必须在未来几年内正常工作,所以我必须使用我需要工作的所有语言的改进。多一次非常感谢吸血鬼的帮助。
  • 我认为正则表达式解决方案在未来不会变得不兼容。我更认为正则表达式解决方案会更持久,可能也更高效,但这有待测试。
【解决方案2】:

Java 8 添加了(除其他外)Lambda、流和函数式接口。

您可以使用流来简化对象的循环。但是你在 Python 中看到的语法和在 java 中的语法不一样。

【讨论】:

  • 如果没有示例,这将无济于事
猜你喜欢
  • 2018-12-24
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2018-06-11
  • 2016-01-10
  • 2016-09-23
相关资源
最近更新 更多