所以我提取了一个字符串列表,例如{“ADD”,“DEL”,“CHG”,“DEL”,“NA”,“ADD”,“BLAH”,“YAK”,....} JSON请求并将它们传递到哈希集以避免重复。 如果HashSet除了“ADD”或“NA”或“both”之外还有其他任何内容,我如何让我的函数返回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"));
}
答案 0 :(得分: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));
}
最大限度地减少条件。这有帮助吗?
答案 1 :(得分: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;
答案 2 :(得分:0)
如果(hashSet.contains(&#34; ADD&#34)||(hashset.contains(&#34; NA&#34)) 返回false;
使用它谢谢
答案 3 :(得分:0)
您的问题的解决方案是检查输入集中“NA”和“ADD”的其他内容。这可以通过使用验证集添加输入集来实现,同时如果输入集中没有找到新元素,则会出现错误,否则为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;
}
}
答案 4 :(得分:0)
根据我的理解,您需要一种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()
的确切结果。
答案 5 :(得分:-1)
除了我有多大你的名单或你的意图是什么,但是根据你提供的内容,一个天真的解决方案就是在HashSet上对这些选定的单词进行3次搜索追踪的命中。然后将它与HashSet的size()进行比较。