我有一个单词列表(编程语言),我想找出字母表中的哪个字母出现在这些单词中,然后将这些单词的字符串总长度相加,最后返回一个字母,返回与这些单词匹配的最长字符串。这是我到目前为止所得到的,我几乎没有进一步的进展。
这是我试图更好地理解java流的一个练习。
package com.example;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class DemoApplicationTests {
@Test
public void argh() {
List<String> list = new ArrayList<>();
list.add("java");
list.add("php");
list.add("python");
list.add("perl");
list.add("c");
list.add("lisp");
list.add("c#");
Supplier<Stream<String>> streamSupplier = () -> list.stream();
IntStream.range('a', 'z').forEach(i -> {
int strlen = streamSupplier.get()
.filter(k -> {
char ch = (char) i;
return k.contains("" + ch);
}
)
.map(s -> s.length())
.mapToInt(Integer::new)
.sum();
System.out.println((char) i + " : " + strlen);
}
);
}
}
我期望的最终输出(结果)类似于“p:17”
由于字符p出现在单词php、python、perl、lisp中,它对这些单词求和并返回字符串长度为17。
最好是在
map<String,int> with the size of 1
或者只包含最长字符串的东西。
这里有一些伪代码,关于我如何用“普通”java编写它:
int previousSum = 0;
for (string ch in ('a' to 'z') ) {
int stringlengthSum = findallMatchesInListandSumStringlength(stringlist,ch);
if (stringlengthSum > previousSum) {
previousSum = stringLengthSum;
longestCharacter = ch;
}
}
System.out.println("The longest sum is: " + previousSum + " by the character: " + longestcharacter);
你离得很近,基本上只是错过了流的顺序。
为了使整个排序更加容易,您可以创建一个专用类:
class CharacterLengthSumResult implements Comparable<CharacterLengthSumResult> {
final char c;
final int sum;
CharacterLengthSumResult(char c, int sum) {
this.c = c;
this.sum = sum;
}
@Override
public int compareTo(CharacterLengthSumResult o) {
return Integer.compare(o.sum, sum);
}
}
然后,流逻辑变成:
Optional<CharacterLengthSumResult> first = IntStream.range('a', 'z').mapToObj(i -> {
String c = ((char) i) + "";
int sum = list.stream().filter(s -> s.contains(c)).mapToInt(String::length).sum();
return new CharacterLengthSumResult((char)i, sum);
}).sorted().findFirst();
if (first.isPresent()) {
System.out.println(first.get().c + " -> " + first.get().sum);
}
如果你想把整个东西作为一张地图,你可以用一个收集器来扩展排序:
...sorted().collect(Collectors.toMap(s -> s.c, s -> s.sum));
我不得不稍微修改和优化你的代码。最终解决方案将是:
Map.Entry<Integer, Integer> max = IntStream.range('a', 'z').boxed().collect(Collectors.toMap(i -> i, i -> list.stream()
.filter(k -> k.contains("" + (char) i.intValue()))
.map(String::length)
.mapToInt(Integer::new)
.sum()))
.entrySet().stream()
.max((e1, e2) -> e1.getValue().compareTo(e2.getValue())).get();
System.out.println((char)max.getKey().intValue() + ":" + max.getValue());
变化是:
1) 将IntStream
转换为Stream
2) 收集对:符号的int值-
至少3)找到包含最大元素的地图条目
问题内容: 我正在寻找一个php函数,该函数将接受一个输入字符串,并通过去除所有仅保留字母数字的特殊字符来返回其净化版本。 我需要另一个功能相同但仅返回字母字符AZ的函数。 任何帮助,不胜感激。 问题答案: 警告:请注意,英语不仅限于AZ。 尝试执行以下操作删除az,AZ和0-9以外的所有内容: 如果字母数字的定义包括外语字母和过时的脚本,则您将需要使用Unicode字符类。 尝试以下操作仅保留A
我试图找出我的字符串是否包含从a到z的所有字母 我们可以通过其他方法解决这个问题,但我正在尝试仅使用模式和匹配器来解决它。
我有一个使用函数的string参数并传递给返回最长单词的函数的代码。 我想知道是否可以使用,然后使用索引访问每个字母表,这样我就可以知道字符串中有多少个单词,然后比较它们,这样我就可以返回最长的单词。 我是这样开始的。它与典型数组很好地工作,但典型数组需要预定义的大小。
问题内容: 我尝试使用此功能,但没有成功- 问题答案: 使用。 注意:删除了空格,因为通常不将其视为字母数字。
问题内容: 我有一个字符串,我想用一个星号替换任何不是标准字符或数字的字符,例如(az或0-9)。例如,“ h ^&ell`。,| ow] {+ orld”被替换为“ h * ell * o * w * orld”。请注意,多个字符(例如“ ^&”)将替换为一个星号。我将如何去做呢? 问题答案: 正则表达式可以解救! 例:
GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串