![](/img/trans.png)
[英]Java HashSet contains value other than the intended one, not predefined value
[英]Java HashSet<> : Return false if HashSet contains values other than specified
所以我從 JSON 請求和將它們傳遞到哈希集以避免重復。 如果 HashSet 有除“ADD”或“NA”或兩者之外的任何其他內容,我如何讓我的函數返回 false? 任何幫助表示贊賞。
更新:在我的代碼中,我只是在所有我能想到的我不需要的值周圍添加了一個 NOT 條件。我需要一個更有效的解決方案。
另外:我的 true() 條件是 ADD 必須始終存在,而 NA 是可選的。除了強制性的 "ADD" 和可選的 "NA" 之外,不得存在其他值。 例如:
下面的代碼段沒有這個檢查,我正在尋找最不冗長的最佳解決方案。
這是片段。 字符串列表作為參數傳遞給 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.