我想从数组中过滤字符串。例如,我有五串从数组中过滤字符串
- adcfd
- adjnrj
- amlkc
- nfldkm
- cslkls
如果我想创建一个新的数组,包含过滤阵列,例如它与“广告”,它会创建两个元素的数组[adcfd,adjnrj]
开始,或者如果它开始“一”,我们会与三个元素的数组[adcfd,adjnrj,amlkc]
我脑海中唯一的事情就是比较所有字符串中的每个字符,直到我们得到两个'trues',然后我们可以结束循环。
如果有任何我不知道的功能,我可以提出一些建议吗?
我想从数组中过滤字符串。例如,我有五串从数组中过滤字符串
如果我想创建一个新的数组,包含过滤阵列,例如它与“广告”,它会创建两个元素的数组[adcfd,adjnrj]
开始,或者如果它开始“一”,我们会与三个元素的数组[adcfd,adjnrj,amlkc]
我脑海中唯一的事情就是比较所有字符串中的每个字符,直到我们得到两个'trues',然后我们可以结束循环。
如果有任何我不知道的功能,我可以提出一些建议吗?
您需要使用java中的String
类的startsWith方法。例如,
public static void main(String args[]) {
String Str = new String("Welcome to StackOverflow");
System.out.print("Return Value :");
System.out.println(Str.startsWith("Welcome"));
System.out.print("Return Value :");
System.out.println(Str.startsWith("StackOverflow"));
}
它打印:
Return Value :true
Return Value :false
编辑:以前我以为OP会从我给出的例子尝试我没有给直截了当的答案OP的问题。由于其他人已经分享了他们的答案,我分享了一个简单的代码片段,它将提供OP所需的输出。
String[] strings = {"adcfd", "adjnrj", "amlkc", "nfldkm", "cslkls"};
String prefix = "ad";
ArrayList<String> result = new ArrayList<>();
for (String str : strings) {
if (str.startsWith(prefix)) {
result.add(str);
}
}
System.out.println(result.toString());
它打印:
[adcfd, adjnrj]
我觉得你可以排序字符串第一,那么你可以得到所有匹配的字符串没有比较所有字符串元素。
替代代码段:
public class Demo {
public List<String> test(String[] strs,String filter){
List<String> res = new LinkedList<>();
Arrays.sort(strs);
for(String str:strs){
if(str.startsWith(filter)){
res.add(str);
continue;
}
if(str.compareTo(filter)>0){
return res;
}
}
return res;
}
public static void main(String[] args){
String[] strs = {"adcfd","adjnrj","amlkc","nfldkm","cslkls"};
Demo demo = new Demo();
String filter = "a";
System.out.println(demo.test(strs, filter));
}
}
输出:
[adcfd, adjnrj, amlkc]
有在Java中8
更简单的方法由于Stream API现在可用于Java。
public static void main(String[] args)
{
String[] stringArray = {"adcfd", "adjnrj", "amlkc", "nfldkm", "cslkls"};
List<String> myList = Arrays.asList(stringArray);
Object[] result = myList.stream().filter(s -> s.startsWith("ad")).toArray();
for(Object obj : result){
System.out.println(obj);
}
}
注意这将工作只在Java 8
String[] strings = {"adcfd", "adjnrj", "amlkc", "nfldkm", "cslkls"};
String prefix = "ad";
String[] result = null;
// Use String#startsWith
result = Stream.of(strings).filter(str -> str.startsWith(prefix))
.collect(Collectors.toSet()).toArray(new String[0]);
Stream.of(result).forEach(System.out::println); //-> adjnrj adcfd
// Use String#matches (with regexp)
result = Stream.of(strings).filter(str -> str.matches("^" + prefix + ".*$"))
.collect(Collectors.toSet()).toArray(new String[0]);
Stream.of(result).forEach(System.out::println); //-> adjnrj adcfd
为什么使用'toSet()'而不是'toList()'? –
@LukeLee我没有考虑太多,只是试图删除重复的项目。如果不需要,toList也可以。 – choasia
可能要到[正则表达式(https://en.m.wikipedia.org/wiki/Regular_expression)(正则表达式)如果你打算创建一个过滤系统。 –
查看https://docs.oracle.com/javase/8/docs/api/java/lang/String.html,看看您是否找到某种方式来确定一个字符串是否以另一个字符串开头。 – Misha
@ user306856您是否知道您可以接受您认为可以通过检查旁边的勾号来帮助您的解决方案? – user3437460