如何解决根据 Java 中的值拆分字符串列表
我想要做的是拆分字符串数组,当字符串中的前 6 个字符为零(“000000”)或字符串中的所有数字都为零时。限制为 6 个字符不会很动态。
我得到了这段代码,它完成了我想要实现的目标。
v1 v2 v3 v4
0 1 0.23 7.61% 10.08%
1 2 0.46 7.14% 7.28%
2 3 0.69 4.56% 14.00%
3 4 0.92 12.51% 10.08%
4 5 1.15 8.81% 11.48%
5 6 1.38 0.47% 0.62%
6 7 1.61 0.47% 0.62%
7 8 1.84 0.47% 0.62%
8 9 2.07 1.03% 1.23%
打印出想要的结果
import java.util.*;
public class Main
{
public static void main(String[] args) {
ArrayList<String> unsplitted = new ArrayList<String>();
unsplitted.add("000000: this_should_go_into_first_array");
unsplitted.add("000234: something1");
unsplitted.add("0000ff: something2");
unsplitted.add("000111: something3");
unsplitted.add("000051: something4");
unsplitted.add("007543: something5");
unsplitted.add("000000: and_this_should_go_into_second_array");
unsplitted.add("005612: something7");
unsplitted.add("005712: something8");
System.out.println("Unsplitted list: "+ unsplitted);
List<String> arrlist1 = unsplitted.subList(0,6);
List<String> arrlist2 = unsplitted.subList(6,unsplitted.size());
System.out.println("Sublist of arrlist1: "+ arrlist1);
System.out.println("Sublist of arrlist2: "+ arrlist2);
}
}
但是,我事先不知道零的索引,那么如何通过动态查找零来获得相同的结果?
解决方法
您可以简单地在数组中迭代并在每次检测到 000000 字符串时创建“存储桶”:
ArrayList<String> unsplitted = new ArrayList<String>();
unsplitted.add("000000: this_should_go_into_first_array");
unsplitted.add("000234: something1");
unsplitted.add("0000ff: something2");
unsplitted.add("000111: something3");
unsplitted.add("000051: something4");
unsplitted.add("007543: something5");
unsplitted.add("000000: and_this_should_go_into_second_array");
unsplitted.add("005612: something7");
unsplitted.add("005712: something8");
List<List<String>> results = new ArrayList<>();
unsplitted.forEach(w -> {
if(w.startsWith("000000") || results.isEmpty()) {
// no bucket or detect 000000
List<String> bucket = new ArrayList<>();
bucket.add(w);
results.add(bucket);
}
else {
// not contains 00000 put the value in the last bucket
results.get(results.size() - 1).add(w);
}
});
results.forEach(w -> {
System.out.println("Sublist " + w);
});
这是你期望的结果吗?
结果:
Sublist [000000: this_should_go_into_first_array,000234: something1,0000ff: something2,000111: something3,000051: something4,007543: something5]
Sublist [000000: and_this_should_go_into_second_array,005612: something7,005712: something8]
,
这个问题很有趣。有不同的方法来实现这一点,但我将向您展示一个解决方案,它可以应用于任何长度的第一部分,我们可以将其视为关键。
正如您在介绍中所说,如果支票仅限于 6 个字符,则它不会是动态的。基于此,例如,您可以将字符 ':' 的位置作为参考,并在数组元素之间应用分区。
这是我提出的解决方案:
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Main
{
public static void main(String[] args) {
ArrayList<String> unsplitted = new ArrayList<String>();
unsplitted.add("000000: this_should_go_into_first_array");
unsplitted.add("000234: something1");
unsplitted.add("0000ff: something2");
unsplitted.add("000111: something3");
unsplitted.add("000051: something4");
unsplitted.add("007543: something5");
unsplitted.add("000000: and_this_should_go_into_second_array");
unsplitted.add("005612: something7");
unsplitted.add("005712: something8");
System.out.println("Non-split list: "+ unsplitted);
Predicate<String> filter = (String s) -> {
int indexOfCol = s.indexOf(":");
return s.substring(0,indexOfCol).equals("0".repeat(indexOfCol));
};
Map<Boolean,List<String>> splitMap = unsplitted.stream()
.collect(Collectors.partitioningBy(filter));
List<String> arrayZeroStart = splitMap.get(true);
List<String> arrayNonZeroStart = splitMap.get(false);
System.out.println("Sublist of arrayZeroStart: "+ arrayZeroStart);
System.out.println("Sublist of arrayWithout: "+ arrayNonZeroStart);
}
}
这是输出:
Non-split list: [000000: this_should_go_into_first_array,0000ff:
something2,007543: something5,000000: and_this_should_go_into_second_array,005712: something8]
Sublist of arrayZeroStart: [000000: this_should_go_into_first_array,000000: and_this_should_go_into_second_array]
Sublist of arrayWithout: [000234: something1,005712: something8]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。