【问题标题】:Java : Find if values of csv string A is of the pattern of String BJava:查找csv字符串A的值是否属于字符串B的模式
【发布时间】:2021-03-19 06:50:47
【问题描述】:

我有一个包含逗号分隔值的最终字符串 acceptedList

final String acceptedList = "ABC, HIJ/LMN, PQR1, XYZ";

另一个动态字符串 receivedList 也是一个 csv,作为我函数的输入。

String receivedList  = "ABC, PQR1";

如果 receivedList 中的值与acceptedList 中的值匹配(以任何顺序),它应该返回成功消息。

成功场景示例:

receivedList  = "ABC";
receivedList  = "HIJ/LMN, ABC";
receivedList  = "XYZ, PQR1, ABC";

失败场景示例:

receivedList  = "ABC, UNKNOWN";
receivedList  = "UNKNOWN";
receivedList  = "HIJ-LMN";

我已经实现了以下代码,它工作正常。有没有更好的方法来实现这一点?

public class Driver {

    final static String acceptedList = "ABC, HIJ/LMN, PQR1, XYZ";

    public static void main(String[] args) {
        String receivedList  = "ABC, PQR1";
        System.out.println(checkValues(receivedList));      
    }

    private static String checkValues(String receivedList) {
        List<String> acceptedListArray = Arrays.asList(acceptedList.split(", "));
        String[] receivedArray = receivedList.split(", ");
        for (String string : receivedArray) {
            if (!acceptedListArray.contains(string)) {
                return "Error!";
            }
        }
        return "Success!";
    }
}

输出

Success!

【问题讨论】:

  • 如果可以使用list提供的库函数,则不需要循环。

标签: java arrays arraylist


【解决方案1】:

Set#containsAll

我建议您将值存储在集合中以避免再次处理重复值,然后使用Set#containsAll 检查receivedList 中的所有值是否存在于acceptedList 中。

演示:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Driver {

    final static String acceptedList = "ABC, HIJ/LMN, PQR1, XYZ";

    public static void main(String[] args) {
        String receivedList = "ABC, PQR1";
        System.out.println(checkValues(receivedList));

        receivedList = "ABC, UNKNOWN";
        System.out.println(checkValues(receivedList));
    }

    private static String checkValues(String receivedList) {
        Set<String> acceptedListSet = new HashSet<>(Arrays.asList(acceptedList.split(", ")));
        Set<String> receeivedListSet = new HashSet<>(Arrays.asList(receivedList.split(", ")));

        return acceptedListSet.containsAll(receeivedListSet) ? "Success!" : "Failure!";
    }
}

输出:

Success!
Failure!

【讨论】:

    【解决方案2】:

    您可以使用String#split 将两个 CSV 输入转换为数组。然后,将它们转换为列表并使用List#containsAll 进行断言:

    public class Driver {
        final static String acceptedCSV = "ABC, HIJ/LMN, PQR1, XYZ";
    
        public static void main(String[] args) {
            String receivedCSV  = "ABC, PQR1";
            System.out.println(receivedCSV + " => " + checkValues(receivedCSV));      
            receivedCSV  = "ABC, DEF";
            System.out.println(receivedCSV + "  => " + checkValues(receivedCSV));      
        }
    
        private static String checkValues(String receivedCSV) {
            List<String> acceptedList = Arrays.asList(acceptedCSV.split("\\s*,\\s*"));
            List<String> receivedList = Arrays.asList(receivedCSV.split("\\s*,\\s*"));
    
            return acceptedList.containsAll(receivedList) ? "Success!" : "Error!";
        }
    }
    

    打印出来:

    ABC, PQR1 => Success!
    ABC, DEF  => Error!
    

    【讨论】:

      猜你喜欢
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2013-09-10
      • 2014-03-23
      • 1970-01-01
      • 2014-11-06
      相关资源
      最近更新 更多