【问题标题】:Find the sequence in the String matches the items in the List查找String中的序列匹配List中的项目
【发布时间】:2020-11-29 22:25:43
【问题描述】:

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

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 表示是否等于String names...到目前为止您尝试了什么?
  • 我已经编辑了我的帖子@k88

标签: java string list sequence


【解决方案1】:

嗯,当然有一个更“抽象”和语义上更漂亮的方式来做到这一点:

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() 实现(我引用)“当且仅当指定的对象也是一个列表时返回true,两个列表具有相同的大小,并且两个列表中所有对应的元素对都是相等的。”.

【讨论】:

    【解决方案2】:

    试试这个。

    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
    

    【讨论】:

      【解决方案3】:

      您可以为此目的使用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
      

      【讨论】:

        【解决方案4】:

        使用 Java 8

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

        Collectors.joining 的文档 -

        返回一个连接输入元素的收集器,由 指定的分隔符,按照遇到的顺序。

        【讨论】:

          【解决方案5】:

          您可以将列表转换为数组,然后使用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
          

          【讨论】:

            【解决方案6】:

            这里是一个工作示例:

            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");
                }
            
              }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-28
              • 1970-01-01
              • 2013-12-19
              • 1970-01-01
              • 2015-05-26
              • 1970-01-01
              • 2012-03-05
              • 2012-12-30
              相关资源
              最近更新 更多