【问题标题】:matching string array content with regular expression java用正则表达式java匹配字符串数组内容
【发布时间】:2020-03-21 04:33:45
【问题描述】:

我是 Java 新手。我正在尝试使用 java 正则表达式来比较两个包含名称的字符串数组,然后使用嵌套的 for 循环打印出匹配的名称和不匹配的名称。下面是我的代码

public class Main {

    public static void main(String[] args) {

    // write your code here
        String regex;
        Pattern pattern;
        String stringToBeMatched;
        Matcher matcher;
        boolean b;
     String [] names1 = {"Peter","Harry","Potter","Mary","Jerry"};
        String [] names2 = {"Adam","Jerry","Potter","Martin","Chris", "Rose"};
        //try a loop with two variables for loop

                for (int x=0;x >= names2.length;x++) {
                     regex = names2[x];
                     pattern = Pattern.compile(regex);

                    for(int y = 0; y >= names1.length; y++){
                        stringToBeMatched = names1[y];
                        matcher = pattern.matcher(stringToBeMatched);
                        b = matcher.find();

                        if (b) {System.out.println(names1[y] +" has a match");}
                        else{System.out.println(names1[y] +" has no match");}
                    }
                }
    }
}

代码执行并返回输出Process finished with exit code 0,而不显示任何System.out.println() 语句指定的任何消息。请问各位,我做错了什么?

【问题讨论】:

  • 应该是x < names2.length 和y < names1.length——而不是>=
  • 这听起来像是家庭作业。

标签: java regex nested-loops string-matching


【解决方案1】:

除非我误解了你的意图,否则你不应该在这里使用 Regex。我的理解是你想比较两个数组中的重复元素。

你有你的数组:

String[] names1 = {"Peter", "Harry", "Potter", "Mary", "Jerry"};
String[] names2 = {"Adam", "Jerry", "Potter", "Martin", "Chris", "Rose"};

方法 1 - 嵌套 for 循环。

for(int i = 0; i < names1.length; i++) {
  for(int j = 0; j < names2.length; j++) {
    if(names1[i].equals(names2[j])) System.out.println(names1[i] + " is in both arrays.");
  }
}

方法 2 - 嵌套的 foreach 循环。

for(String name1 : names1) {
  for(String name2 : names2) {
    if(name1.equals(name2)) System.out.println(name1 + " is in both arrays.");
  }
}

方法 3 - 使用List。

List<String> names2List = Arrays.asList(names2);

for(String name1 : names1) {
  if(names2List.contains(name1)) System.out.println(name1 + " is in both arrays.");
}

方法 4 - 使用Set。这是有效的,因为HashSet#add() 不会添加重复项,如果请求则返回 false。

Set<String> names2Set = new HashSet<>(Arrays.asList(names2));

for(String name1 : names1) {
  if(!names2Set.add(name1)) System.out.println(name1 + " is in both arrays.");
}

方法 5 - 使用Streams。如果你想变得花哨。

for(String name1 : names1) {
  if(Arrays.stream(names2).anyMatch(name1::equals)) System.out.println(name1 + " is in both arrays.");
}

【讨论】:

  • @emac 不客气。您能否将我的问题标记为您的解决方案?
【解决方案2】:

对于 lambda 函数,使用“distinct”来不打印重复值。

        String [] names1 = {"Peter","Harry","Potter","Mary","Jerry"};
        String [] names2 = {"Adam","Jerry","Potter","Martin","Chris", "Rose", "Peter", "Peter"};
        for (String name1:
             names1) {
            Arrays.stream(names2).filter(name1::equals).distinct().forEach(System.out::println);
    }

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多