Java 8字符串中奇数位置字符和的替代方案?
好奇地想知道在Java8中是否有一种更优雅的方法来寻找字符串中奇数位置的数字和 这是我目前的职责Java 8字符串中奇数位置字符和的替代方案?,java,string,java-8,java-stream,Java,String,Java 8,Java Stream,好奇地想知道在Java8中是否有一种更优雅的方法来寻找字符串中奇数位置的数字和 这是我目前的职责 /** * Explode string into char array, get sum of ASCII values at odd positions and divide by 10 to convert * to the integer value from that character * @param ccNumber string * @return int sum */
/**
* Explode string into char array, get sum of ASCII values at odd positions and divide by 10 to convert
* to the integer value from that character
* @param ccNumber string
* @return int sum
*/
int calculateSumOfOddDigits(final String ccNumber) {
final char[] digits = ccNumber.toCharArray();
return (digits[0] + digits[2] + digits[4] + digits[6] + digits[8] + digits[10] + digits[12] + digits[14]) / 10;
}
仍然不熟悉Streams和Java 8,并认为您可以这样做:
ccNumber.chars().mapToObj(x -> (char) x {
..add odd position digits
})
欢迎任何建议。像这样的建议怎么样:
String str = "01234";
Integer sum = IntStream.range(0, str.length())
.filter(i -> i % 2 == 0)
.map(str::charAt)
.sum();
System.out.println(sum);
像这样的东西怎么样:
String str = "01234";
Integer sum = IntStream.range(0, str.length())
.filter(i -> i % 2 == 0)
.map(str::charAt)
.sum();
System.out.println(sum);
问题是:如果您想对索引进行筛选,那么转换为字符流是没有用的,因为您会丢失索引信息
但是,可以将索引视为流,并使用.Mp()将其转换为char值。类似的情况如下:
不确定这是否有效,但你明白了另外:这远不如简单的for循环有效,所以我不想这样做。问题是:如果要对索引进行筛选,转换为字符流是没有用的,因为您丢失了索引信息
但是,可以将索引视为流,并使用.Mp()将其转换为char值。类似的情况如下:
不确定这是否有效,但你明白了另外:这远不如简单的for循环有效,所以我不想这样做。从一个普通的非流循环开始怎么样?或者你总是期望你的字符串正好有15个字符长吗?你有没有试过仅仅做一个for循环?也许通过这种方式迭代每个奇怪的字符?您的代码正确吗?似乎需要将每个字符除以10。另外,默认情况下,Java
char
s不是ascii编码,您必须首先转换它们。可能重复的@jornverene JavaString
和char
类型定义为UTF-16,其低范围对应于ascii。我不知道10的除法应该做什么。从一个普通的非流循环开始怎么样?或者你总是期望你的字符串正好有15个字符长吗?你有没有试过仅仅做一个for循环?也许通过这种方式迭代每个奇怪的字符?您的代码正确吗?似乎需要将每个字符除以10。另外,默认情况下,Javachar
s不是ascii编码,您必须首先转换它们。可能重复的@jornverene JavaString
和char
类型定义为UTF-16,其低范围对应于ascii。我不知道10除法应该做什么。我认为直接从流上下文中访问数据通常是不好的做法。它主要是不可伸缩的。@YoYo:像这个答案那样访问一个不可变的、随机访问的数据结构没有什么错。为什么它不能扩展?在当前的实现(Java 8)中,它实际上比原始的chars()
implementation…@Holger您使用流是因为它的惰性和并行化的可能性。如果字符串是8GB文件,该怎么办<代码>拆分器不能来救援-不是那样的。你怎么能切换到Spark RDD?不是那样的。很好的工具,适合这个答案。非常不幸的是,没有能够生成(位置、字符)元组流的内置组件。@YoYo:如果没有可随机访问的数据结构,就无法访问它。这并不能解释为什么在有这样一个结构的时候访问它是“坏习惯”。它确实具有规模;您可以处理任意长度的字符串,只要字符串可以得到。如果用8GB文件替换字符串,则不是在尝试缩放,而是在重新定义任务。@Holger根据上下文,您是对的。然而,在这种情况下,我发现在Java8流中表达这个问题的解决方案没有任何好处。可以说,相对于一个简单的循环解决方案,可读性并没有得到改善。然后设置和生成惰性序列肯定会增加开销。我认为直接从streams上下文访问数据通常是不好的做法。它主要是不可伸缩的。@YoYo:像这个答案那样访问一个不可变的、随机访问的数据结构没有什么错。为什么它不能扩展?在当前的实现(Java 8)中,它实际上比原始的chars()
implementation…@Holger您使用流是因为它的惰性和并行化的可能性。如果字符串是一个8GB的文件呢<代码>拆分器不能来救援-不是那样的。你怎么能切换到Spark RDD?不是那样的。很好的工具,适合这个答案。非常不幸的是,没有能够生成(位置、字符)元组流的内置组件。@YoYo:如果没有可随机访问的数据结构,就无法访问它。这并不能解释为什么在有这样一个结构的时候访问它是“坏习惯”。它确实具有规模;您可以处理任意长度的字符串,只要字符串可以得到。如果用8GB文件替换字符串,则不是在尝试缩放,而是在重新定义任务。@Holger根据上下文,您是对的。然而,在这种情况下,我发现在Java8流中表达这个问题的解决方案没有任何好处。可以说,相对于一个简单的循环解决方案,可读性并没有得到改善。然后设置和生成惰性序列肯定会增加开销。
IntStream.range(0, ccNumber.length())
.filter(i -> i % 2 == 0)
.map(i -> ccNumber.charAt(i))
.collect(Collectors.sum());