一对多验证

时间:2018-09-20 19:47:17

标签: java

我有一种情况,我需要验证电话号码列表,并确保该列表中的每个电话号码都是有效的电话号码(其中有效的电话号码也存储在列表中)。

例如,我有一个这样的电话号码列表:

List<String> phoneNumbers = new ArrayList<String>
   (Arrays.asList("0000000001", "0000000002", "0000000003"));

List<String> validPhoneNumbers = new ArrayList<String>
   (Arrays.asList("0000000001", "0000000004", "0000000002"));

所以我需要验证phoneNumbers列表中的每个电话号码都是validPhoneNumbers的一部分。如果validPhoneNumbers中没有任何内容,则返回false。由于0000000003不属于validPhoneNumbers列表,因此该phoneNumbers列表返回false


我有以下代码:

boolean phoneIsValid = false;
List<String> phoneNumbs = listOfPhoneNumbsValues;
if(phoneNumbs != null) {
   List<String> listOfValidMdn = listOfValidPhoneNumbsValues;
   for(String validMdn : listOfValidMdn) {
      if(phoneNumbs.equals(validMdn)) {
         //The problem I am facing is the following below on how should I 
         //store the phoneIsValid? 
         phoneIsValid = true;
         break;
      }
   }
} 

我面临的问题是如何存储phoneIsValid?它应该是一个布尔数组,然后我必须在末尾进行迭代以查看它是否具有任何假值?

2 个答案:

答案 0 :(得分:3)

您应该以相反的逻辑思考:找到至少一个无效的电话号码。

boolean atLeastOneInvalid = false;
for(String phoneNumber : phoneNumbers){
   if(!validPhoneNumbers.contains(phoneNumber)){
      atLeastOneInvalid = true;
   }
}
// here if atLeastOneInvalid is true you know that some phone number(s) is not valid

答案 1 :(得分:1)

最简单的检查方法;

boolean allPhonesValid = validPhoneNumbers.containsAll(phoneNumbers);

现在将您的其他逻辑应用于boolean这个allPhonesValid参数。

使用Java8 StreamApi;

boolean atLeastOneNumberInvalid = phoneNumbers.stream().anyMatch(phoneNumber -> !validPhoneNumbers.contains(phoneNumber));

PS:流解决方案效果很好,而不是其他性能。因为如果anyMatch查找首先不包含,则会中断。