簡體   English   中英

Java HashSet<>:如果 HashSet 包含指定以外的值,則返回 false

[英]Java HashSet<> : Return false if HashSet contains values other than specified

所以我從 JSON 請求和將它們傳遞到哈希集以避免重復。 如果 HashSet 有除“ADD”或“NA”或兩者之外的任何其他內容,我如何讓我的函數返回 false? 任何幫助表示贊賞。

更新:在我的代碼中,我只是在所有我能想到的我不需要的值周圍添加了一個 NOT 條件。我需要一個更有效的解決方案。

另外:我的 true() 條件是 ADD 必須始終存在,而 NA 是可選的。除了強制性的 "ADD" 和可選的 "NA" 之外,不得存在其他值。 例如:

  1. {ADD} 返回真
  2. {ADD,NA} 返回真
  3. {ADD,DEL} 返回 false
  4. {DEL,YAK} 返回 false 等。

下面的代碼段沒有這個檢查,我正在尋找最不冗長的最佳解決方案。

這是片段。 字符串列表作為參數傳遞給 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 com.google.common.collect.Sets;
 String add= "ADD";
 String NA ="NA"
 final Set<String> Strings = Sets.newHashSet("ADD","DEL","CHG","DEL","NA","ADD","BLAH","YAK");

 if (!((Strings .contains(add))||(Strings .contains(NA )))){
 return false;
 }

根據您的要求,

if(String.contains(add)){
    if(String.contains(NA)){
        return true;
          }
     }
 return false;

據我了解這個問題,您需要一個驗證方法來驗證您的Set 例如,如果來自 JSON 的列表只是 { "ADD", "NA", "ADD" },那就沒問題了,您的方法應該返回 true。 如果列表中有其他值,如問題中的示例,它應該返回 false。

當您知道如何操作時,這並不復雜:

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

Java 集合框架中的removeAll方法是所謂的集合操作之一(不是因為它適用於集合,它也適用於列表和映射)。 您可以將其視為集合差操作的實現。

讓我們試試這個方法:

    List<String> fromJson 
            = Arrays.asList("ADD", "DEL", "CHG", "DEL", "NA", "ADD", "BLAH", "YAK");
    Set<String> setToCheck = new HashSet<>(fromJson);
    Set<String> specifiedValues = new HashSet<>(Arrays.asList("ADD", "NA"));
    // or in Java 9: Set<String> specifiedValues = Set.of("ADD", "NA");

    boolean ok = setHasOnlySpecifiedValues(specifiedValues, setToCheck);
    System.out.println("The result of the check is: " + ok);

這打印:

The set contained other values: [YAK, CHG, DEL, BLAH]
The result of the check is: false

最后,您可能不希望在檢查方法中使用System.out.println()語句。 我現在把它放在那里,所以你可以看到removeAll()的確切結果。

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

盡量減少條件。 這有幫助嗎?

if(hashSet.contains("ADD")||(hashset.contains("NA")) 返回假;

使用它謝謝

您的問題的解決方案是檢查輸入集中的“NA”和“ADD”以外的任何內容。 這可以通過將輸入集與驗證集一起添加來實現,同時這樣做,如果在輸入集中找不到新元素,您將得到 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;
                } 

            }

您的列表有多大或您的意圖是什么,這超出了我的理解,但從您提供的內容來看,我腦子里最幼稚的解決方案是在 HashSet 上對那些選定的單詞進行 3 次搜索,並使用計數器跟蹤命中。 然后將其與 HashSet 的 size() 進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM