查找 String 中的序列与 List 中的项目相匹配

Find the sequence in the String matches the items in the List

假设我有一个列表,然后我将名字添加到列表中

List<String> listOfName = new ArrayList();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");

我有一个字符串 String names = "abc\r\npqr\r\nxyz";

我想验证字符串的组成顺序是否与列表中元素的顺序相同。

例如:abc 应该先出现,然后是 pqr,然后是 xyz

我想做什么:

int flag = 1;
for(int i=0; i<listOfName.size()-1;i++){
    if(names.replace("\r\n","").split(listOfName.get(i))[1].indexOf(listOfName.get(i+1))!=0){
        flag = 0;
        break;
    }
}
if(flag==1){
    System.out.println("True");
} else {
    System.out.println("False");
}

是否有更好的解决方案来做同样的事情,因为我怀疑它在某些情况下可能会失败

您可以利用 String.join 从项目列表中创建一个 String 并将 (Windows-) 换行符 (\r\n) 作为分隔符.然后检查它是否等于String names,像这样:

public static void main(String[] args) {
    List<String> listOfName = new ArrayList<>();
    listOfName.add("abc");
    listOfName.add("pqr");
    listOfName.add("xyz");
    
    String names = "abc\r\npqr\r\nxyz";
    
    //  create a linebreak-separated String from the items of the list
    String listItems = String.join("\r\n", listOfName);

    /*
     *  and compare it to the String that might contain those items
     *  in the order they appear in the list 
     */
    if (listItems.equals(names)) {
        System.out.println(listItems + "\r\n== equals ==\r\n"+ names);
    } else {
        System.err.println(listItems + "\r\n!= is not equal to !=\r\n" + names);
    }
}

这输出

abc
pqr
xyz
== equals ==
abc
pqr
xyz

可以将列表转成数组,然后用Arrays.equals\r\n上拆分字符串得到的数组进行比较。

演示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> listOfName = new ArrayList<>();
        listOfName.add("abc");
        listOfName.add("pqr");
        listOfName.add("xyz");

        String names = "abc\r\npqr\r\nxyz";
        String[] namesArr = names.split("\r\n");

        System.out.println(Arrays.equals(namesArr, listOfName.toArray()));
    }
}

输出:

true

这里有一个工作示例:

import java.util.List;
import java.util.ArrayList;


class Main {
  public static void main(String[] args) {
    List<String> listOfName = new ArrayList();
    listOfName.add("abc");
    listOfName.add("pqr");
    listOfName.add("xyz");

    String names = "abc\r\npqr\r\nxyz";
    String[] splitted_names = names.split("\r\n");

    boolean noNameFound = true;
    for (String name : splitted_names) {
      if (listOfName.contains(name)) {
        System.out.println("Found name " + name + " in listOfName! ");
        noNameFound = false;
      } 
    }
    if (noNameFound) {
          System.out.println("No name found that matched");
    }

  }
}

嗯,肯定有更“抽象”和语义上更漂亮的方法来做到这一点:

public class CompareList {

    public static void main(String[] args) {
        List<String> listOfNames = new ArrayList<String>();
        listOfNames.add("abc");
        listOfNames.add("pqr");
        listOfNames.add("xyz");
        
        String names = "abc\r\npqr\r\nxyz"; // define string
        boolean match = checkList(listOfNames, names, "\r\n"); //check match
        System.out.println(match); //print match
    }
    
    private static boolean checkList(
            List<String> list,
            String content,
            String delimiter) {
        
        return Arrays.asList(
                content.split(Pattern.quote(delimiter))).equals(list);
    }
    
}

这将打印 true

在这里你有方法checkList()(或你喜欢的任何名称)使用给定的分隔符(在你的例子中是\r\n)分割字符串,将结果数组变成List 并调用 equals() 将其与输入 List 进行比较,作为 Listequals() 实现(我引用)"Returns 当且仅当指定对象也是一个列表时为真,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。".

使用 Java 8

String names = listOfName.stream().collect(Collectors.joining("\r\n"));

Collectors.joining 的文档 -

Returns a Collector that concatenates the input elements, separated by the specified delimiter, in encounter order.

试试这个。

List<String> listOfName = new ArrayList<>();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
System.out.println(String.join("\r\n", listOfName).equals(names));

输出

true