我有一个项目列表,其中每个项目都可以属于一个或多个类别。对于一组有限的category(string),我想创建一个类别为键的Items列表为值的map。
假设我的Item类的定义如下所示:
public static class Item{
long id;
List<String> belongsToCategories;
public List<String> getBelongsToCategories() {
return belongsToCategories;
}
public void setBelongsToCategories(List<String> belongsToCategories) {
this.belongsToCategories = belongsToCategories;
}
public Item(long id,List<String> belongsToCategories) {
this.id = id;
this.belongsToCategories = belongsToCategories;
}
@Override
public String toString() {
return "Item{" + "id=" + id + '}';
}
}
Run Code Online (Sandbox Code Playgroud)
以及项目列表:
public static void main(String[] args) {
List<Item> myItemList = new ArrayList<>();
myItemList.add(new Item(1,Arrays.asList("A","B")));
myItemList.add(new Item(2,Arrays.asList("A","C")));
myItemList.add(new Item(3,Arrays.asList("B","C")));
myItemList.add(new Item(4,Arrays.asList("D")));
myItemList.add(new Item(5,Arrays.asList("D","E")));
myItemList.add(new Item(6,Arrays.asList("A","F")));
Map<String,List<Item>> myMap= new …Run Code Online (Sandbox Code Playgroud) 我有一个字符串,如果可能的话我必须分成相等长度的子串.我发现这个解决方案只有在字符串长度为4的倍数时才有效.
String myString = "abcdefghijklm";
String[] split = myString.split("(?<=\\G....)");
Run Code Online (Sandbox Code Playgroud)
这将产生:
[abcd, efgh, ijkl, m]
Run Code Online (Sandbox Code Playgroud)
我需要的是从"字符串的末尾"拆分.我想要的输出应该是这样的:
[a, bcde, fghi, jklm]
Run Code Online (Sandbox Code Playgroud)
我如何实现这一目标?
replaceAll(String regex, String replacement)字符串类中的方法用给定的替换替换该字符串中与给定的正则表达式匹配的每个子字符串。是否可以否定正则表达式,以便替换所有不匹配的内容?
例如,我在方括号内有一个带有子字符串的字符串(没有嵌套的方括号,其余的字符串既不包含开方括号也不包含方括号)
String test = "some text [keep this] may be some more ..";
Run Code Online (Sandbox Code Playgroud)
我找到了一个正则表达式来提取[]之间的子字符串:
String test = "some text [keep this] may be some more ..";
Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher(test);
while(m.find()) {
test = m.group(1);
}
Run Code Online (Sandbox Code Playgroud)
我想做的是,如果可能的话,使用replaceAll以某种方式排除正则表达式的方法来替换与上述正则表达式不匹配的所有内容。
String regex = "\\[(.*?)\\]";
test.replaceAll("(?!" + regex + "$).*", "")
Run Code Online (Sandbox Code Playgroud)
我通过搜索“ negate regex”发现这和其他一些不适用于我。
预期输出为 test = "keep this"
我正在尝试根据条件过滤列表。是否有其他替代方法可以中断Java 8流以停止过滤?
举个例子:假设我有以下列表。
List<String> list = Arrays.asList("Foo","Food" ,"Fine","Far","Bar","Ford","Flower","Fire");
list.stream()
.filter(str -> str.startsWith("F")) //break when str doesn't start with F
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我希望从头开始以“ F”开头的所有字符串,一旦找到不以“ F”开头的字符串,我想停止过滤。没有流,我将执行以下操作:
List<String> result = new ArrayList<>();
for(String s : list){
if(s.startsWith("F")){
result.add(s);
}
else{
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如何在信息流中使用“中断”?
我想同时执行两个流并生成第三个流作为前两个的组合,假设我有以下两个流
Stream<String> a = Stream.of("f","b","z");
Stream<String> b = Stream.of("foo","bar","baz");
Run Code Online (Sandbox Code Playgroud)
我想从这两个中生成一个新的,这相当于这个
Stream<String> c = Stream.of("f:foo","b:bar","z:baz");
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的是Stream.concat或Stream.of
Stream<String> result = Stream.concat(a, b); or
Stream<String> result = Stream.of(a, b).flatMap(s -> s);
Run Code Online (Sandbox Code Playgroud)
两者相互依存并与此相对应
Stream.of("f","b","z","foo","bar","baz");
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的解决方法是将两个流的元素收集到一个列表中,并遍历两个列表以连接单个元素并将结果列表转换为流。strem api中是否有较短的方法或现有功能可以同时在两个流上工作?
List<String> aList = a.collect(Collectors.toList());
List<String> bList = b.collect(Collectors.toList());
List<String> result = new ArrayList<>();
for(int i = 0; i< aList.size(); i++){
result.add(aList.get(i)+":"+bList.get(i));
}
Stream<String> cc = result.stream();
Run Code Online (Sandbox Code Playgroud) java ×5
java-stream ×3
java-8 ×2
regex ×2
break ×1
grouping ×1
lambda ×1
replaceall ×1
split ×1
string ×1