Java HashSet:如果HashSet包含的值不是指定的值,则返回false

Java HashSet:如果HashSet包含的值不是指定的值,则返回false,java,hashset,Java,Hashset,所以我从JSON请求中提取了一个字符串列表,例如{ADD,DEL,CHG,DEL,NA,ADD,BLAH,YAK,…},并将它们传递到哈希集以避免重复。 如果HashSet除了ADD或NA或两者之外还有其他内容,如何让函数返回false? 谢谢你的帮助 import java.util.HashSet; import java.util.Set; public class HashSetTheory {

所以我从JSON请求中提取了一个字符串列表,例如{ADD,DEL,CHG,DEL,NA,ADD,BLAH,YAK,…},并将它们传递到哈希集以避免重复。 如果HashSet除了ADD或NA或两者之外还有其他内容,如何让函数返回false? 谢谢你的帮助

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }
更新: 在我的代码中,我只是在我可能认为不需要的所有值周围添加了一个NOT条件。我需要一个更有效的解决方案

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }

另外:我的真实条件是,当NA是可选的时,ADD必须始终存在。除了强制的ADD和可选的NA之外,不能存在其他值。 例如:

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }
{ADD}返回true {ADD,NA}返回true {ADD,DEL}返回false {DEL,YAK}返回false等。 下面的代码片段没有这个检查,我正在寻找最简单的解决方案

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }
这是片段。字符串列表作为参数传递给isAddOrNa

private boolean isAddOrNa(List<AllActions> allActions) {
    Set<String> actions = new HashSet<>();
    for (com.demo.Action action : allActions) {
        actions.add(action.getName());
    }
    return ((actions.size() <= 2) && (actions.contains("ADD") || actions.contains("NA"))) &&
            !(actions.contains("DEL") || actions.contains("CHG") || actions.contains("BLAH") || actions.contains("YAK"));
}
            import java.util.HashSet;
            import java.util.Set;

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }

我不知道你的列表有多大,也不知道你的意图是什么,但根据你提供的信息,一个简单的解决方案是在哈希集上搜索3个选定的单词,并使用计数器跟踪点击。然后将其与HashSet的大小进行比较。

ifhashSet.containsADD | | HashSet.containsNA
            import java.util.HashSet;
            import java.util.Set;

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }
返回false

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }

使用它,谢谢

问题的解决方案是检查输入集中是否存在NA和添加的任何其他内容。这可以通过将输入集与验证集一起添加来实现,如果在输入集中找不到新元素,则为false,否则为true:

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }

据我所知,您希望为您的集合提供验证方法。例如,如果JSON中的列表仅仅是{ADD,NA,ADD},那么就可以了,您的方法应该返回true。如果列表中有其他值,如问题中的示例,则应返回false

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }
当您知道如何操作时,这并不复杂:

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }
private static boolean setHasOnlySpecifiedValues(
        Set<String> specifiedValues, Set<String> setToCheck) {
    // we check setToCheck by removing specifiedValues and seeing if there are any
    // values left: however, the caller may be surprised if we remove elements from
    // the set passed to us, so work on a copy instead
    Set<String> workingCopy = new HashSet<>(setToCheck);
    workingCopy.removeAll(specifiedValues);
    if (workingCopy.isEmpty()) { // there were only specified values
        return true;
    } else {
        System.out.println("The set contained other values: " + workingCopy);
        return false;
    }
}
这张照片是:

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }
The set contained other values: [YAK, CHG, DEL, BLAH]
The result of the check is: false
最后,您可能不希望检查方法中包含System.out.println语句。我现在把它放在那里,这样你就可以看到removeAll的确切结果

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

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }

尽量减少条件。这有帮助吗?

到目前为止您尝试了什么?发布你的代码!你运行它时发生了什么?你以为会发生什么?你具体有什么问题?两者都有还是两者都有?两者都有。如果你的目标是混淆,你肯定成功了……请阅读。不要仅仅因为你还没有必要的代表就发表评论作为答案。“不要滥用这个系统。恕我不敢苟同,@JimGarrison。”。这确实回答了所问的问题。此外,它并没有免费提供代码,坦率地说,OP不值得花这么少的精力来演示。我们可以讨论这是否是该问题的最佳解决方案,但答案的格式符合我的喜好。对不起,我之前没有向您提供此更新。我的真实条件是,当NA是可选的时,ADD必须始终存在。除了强制的ADD和可选的NA之外,不能存在其他值。如果不存在预期的NA,则上述条件将返回true。如果NA是可选的,则u只能有“添加”的条件。如果String.containsadd{return false;}我的意思是{ADD,NA}可以是true,{ADD}可以是true,但是{ADD,DEL}或{ADD,YAK}或{DEL,YAK}将是false。不仅ADD必须始终存在,但是,除NA之外的任何其他值以及ADD都应返回false。我的真实条件是,当NA为可选时,ADD必须始终存在。除强制ADD和可选NA之外,不得存在其他值。如果没有预期的NA,则上述条件将返回true。我的真实条件是,当NA为可选时,ADD必须始终存在。除强制ADD和可选NA外,不得存在其他值。请更新我们如何在您的解决方案中添加此检查?只需添加条件setToCheck.containsADD@不幸的是,如果所有操作只包含ADD,则此条件将返回false。还有| | |!actions.containsNA&&actions.size==1将在allActions包含其他值(如DEL)时返回true。这个逻辑有很多问题,我测试过了。它起作用了。我的解决方案检查它是否包含ADD,如果hashset包含NA,那么它的大小必须是2,否则大小将是1。很抱歉,在我将其粘贴到IDE中进行测试后,我错误地删除了括号并将其放错了位置。这很有效,谢谢。
            import java.util.HashSet;
            import java.util.Set;

            public class HashSetTheory {

                public static void main(String args[]){

                    String[] sourceData = {"ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK" }; // Output is false
                    //String[] sourceData = {"ADD","ADD","ADD","NA","NA","ADD","NA","ADD" };  // Output is true
                    //String[] sourceData = {"ADD","ADD","ADD" };  // Output is true
                    //String[] sourceData = { };  // Output is false
                    //String[] sourceData = { "NA" , "Something"};  // Output is false

                    Set<String> myRepo = new HashSet<>();

                    // Populating the set with input data
                    for(String data : sourceData){
                        myRepo.add(data);
                    }

                    Set<String> check = new HashSet<>();
                    check.add("NA");
                    check.add("ADD");

                    System.out.println("==>" + validateData(myRepo,check) );

                }

                public static boolean validateData(Set<String> myRepo,Set<String> check){
                    boolean retVal = true;

                    if(myRepo.size()==0){
                        return false;
                    }

                    for (String s : myRepo) {
                        // Adding an element in set returns false if it already exists
                        if(check.add(s)){
                            //This check is pass only if the set has some new item in it
                            retVal = false;
                            break;
                        }
                    }

                    return retVal;
                } 

            }