2017-11-22 11 views
-2

これで、{"ADD"、 "DEL"、 "CHG"、 "DEL"、 "NA"、 "ADD" "BLAH"、 "YAK"、....}をJSONリクエストから取得し、ハッシュセットに渡して重複を避けました。 HashSetに "ADD"または "NA"または "both"以外のものがある場合、関数がfalseを返すようにするにはどうすればよいですか? ヘルプは評価されました。Java HashSet <>:HashSetに指定された値以外の値が含まれている場合はfalseを返します

更新: 私のコードでは、私は、私が必要と思わないすべての値の周りにNOT条件を追加しました。私はより効果的な解決策が必要です。

また、NAは省略可能ですが、ADDは常に存在しなければなりません。必須の「ADD」およびオプションの「NA」以外の値は存在しない必要があります。 例えば:

  1. は{ADD}真
  2. trueを返す{NAを追加}返す{ADDを、DELは}
等、偽
  • {DEL、YAK}がfalseを返すを返します

    以下のスニペットにはこのチェックがありません。私は、最も冗長性のある最良のソリューションを探しています。

    ここがスニペットです。ストリングのリストは、isAddOrNa()の引数として渡されます。ウルreuirementに応じ

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

    これまでに何を試みましたか?あなたのコードを投稿してください!あなたがそれを走らせたとき何が起こったのですか?代わりに何が起こると思いますか?具体的に何が問題になっていますか? https://stackoverflow.com/help/mcve – Robert

    +1

    両方または「両方」? – shmosel

    +0

    "both"の両方の値と同じです。 – sahilsahadevan

    答えて

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

    条件を最小化する。これは役に立ちますか?

    +0

    残念ながら、allActionsに "ADD"だけが含まれている場合、この条件はfalseを返します。また、||(!actions.contains( "NA")&& actions.size()== 1))は、allActionsにDELのような他の値が含まれている場合にtrueを返します。このロジックには多くの問題があります。 – sahilsahadevan

    +0

    私はそれをテストしました。できます。私の解決策では、 "ADD"が含まれているかどうかチェックし、ハッシュセットに "NA"が含まれている場合はサイズを2にしなければなりません。 –

    +0

    IDEで貼り付けた後、残念です。これは、ありがとう、動作します。 – sahilsahadevan

    0
    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; 
    
    +0

    申し訳ありませんが、私はあなたにこのアップデートを早期に伝えていませんでした。私のtrue()条件は、NAは省略可能ですが、ADDは常に存在しなければならないということです。必須の "ADD"およびオプションの "NA"以外の値は存在していなければなりません。上記の条件は、 "NA"だけが存在し、期待されていない場合にtrueを返します。 – sahilsahadevan

    +0

    NAがオプションの場合、uは「ADD」のみの条件を持つことができます。 – SalmaSulthan

    +0

    {ADD、NA}は真である可能性があります。{ADD}は真ですが、{ADD、DEL}または{ADD、YAK}または{DEL、YAK}は偽です。 – sahilsahadevan

    -1

    それはあなたのリストがいかに大きいかあなたの意図が何であるかが、あなたは、の上から素朴なソリューションを提供してきたものから、私を超えています私の頭は、ヒットを追跡しているカウンターでそれらの選択された単語のHashSetを3回検索することです。それをHashSetのsize()と比較します。

    +0

    [回答]をお読みください。まだ必要な担当者がいないため、コメントを回答として投稿しないでください。システムを乱用しないでください。 –

    +0

    別れよう、@ジムガリソン。これは尋ねられたように質問に答えます。さらに、OPは率直に言ってもそれほどの手間はありませんでしたが、無料でコードを提供しているわけではありません。私たちはこれが問題の最良の解決策であるかどうか議論することができますが、答えの形式は私の好みです。 –

    0

    (hashSet.contains( "ADD")||(hashset.contains( "NA")は)falseを返す 場合、

    は、それを使用して感謝

    +0

    私のtrue()条件は、NAは省略可能ですが、ADDは常に存在しなければなりません。必須の "ADD"およびオプションの "NA"以外の値は存在していなければなりません。上記の条件は、 "NA"だけが存在し、期待されていない場合にtrueを返します。 – sahilsahadevan

    0

    はあなたの問題の解決をするためにチェックすることです入力セットに "NA"と "ADD"以外のものがあります。入力セットに入力セットを追加することで実現できますが、入力セットに新しいエレメントが見つからない場合は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; 
           } 
    
          } 
    
    0

    私は質問を理解しているように、ヨーヨーSetの検証方法が必要です。たとえば、JSONのリストが{"ADD"、 "NA"、 "ADD"}の場合、それは問題なく、あなたのメソッドはtrueを返さなければなりません。質問の例のようにリストに他の値がある場合は、falseを返す必要があります。

    あなたはどのように知っているときそれは複雑ではありません:JavaコレクションフレームワークでremoveAll方法は、それがセットで動作するので、それはリストとマップ上で動作しない(いわゆる集合演算の一つである

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

    あまりにも)。あなたはそれをセット差分操作の実装と考えるかもしれません。

    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()の正確な結果を見ることができます。

    +0

    私のtrue()条件は、NAは省略可能ですが、ADDは常に存在しなければなりません。必須の "ADD"およびオプションの "NA"以外の値は存在していなければなりません。このチェックをソリューションに追加するにはどうすればよいですか? – sahilsahadevan

    +0

    'setToCheck.contains(" ADD ")'という条件を追加するだけです。 @sahilsahadevan –

    関連する問題