【问题标题】:Filtering strings from an array从数组中过滤字符串
【发布时间】:2016-12-14 03:01:14
【问题描述】:

我正在尝试从数组中过滤字符串。例如我有五个字符串

  1. adcfd
  2. adjnrj
  3. amlkc
  4. nfldkm
  5. cslkls

如果我想创建一个包含过滤数组的新数组,例如它以“ad”开头,它将创建一个包含两个元素的数组 [adcfd, adjnrj]

或者如果它以 'a' 开头,我们将得到一个包含三个元素的数组 [adcfd, adjnrj, amlkc]

我唯一想到的是比较所有字符串中的每个字符,直到我们得到两个“真”,然后我们可以结束循环。

如果有什么不知道的功能,可以给点建议吗?

【问题讨论】:

标签: java arrays


【解决方案1】:
    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 如果不需要也可以。
【解决方案2】:

你需要在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 会从我给定的示例中尝试。由于其他人已经分享了他们的答案,我正在分享一个简单的代码 sn-p,它将为 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]

【讨论】:

    【解决方案3】:

    我认为您可以先对字符串进行排序,然后您可以在不比较所有字符串元素的情况下获得所有匹配的字符串

    替代代码段:

    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]
    

    【讨论】:

      【解决方案4】:

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-16
        • 2017-07-15
        • 2022-07-04
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多