问题描述
我目前正在开发一个需要相互比较三个变量的应用程序。
比较规则:仅在以下情况下结果应为true: 所有三个变量都相等 OR 所有三个变量都不同
我的第一个想法是这样的,但我希望对此有一个更优雅的解决方案:
if (value1 == value2 && value2 == value3) || (value1 != value2 && value2 != value3 && value3 != value1) {
// True
} else {
// False
}
如果你们当中有人能想到一个更优雅的解决方案并与我分享,我将非常高兴。 感谢您的提前帮助!
解决方法
如果您的值也是package com.simple.Test;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
/**
*
* @author megaLinux
*/
public class User {
private StringProperty name = new SimpleStringProperty();
public String getName() {
return name.get();
}
public StringProperty nameProperty() {
return name;
}
public void setName(String name) {
this.name.set(name);
}
}
,则可以使用Hashable
。鉴于Set
会丢弃重复的值,您可以将检查简化为以下内容:
Set
,
一次过,还不错。
更“通用”的解决方案有点混乱,因为它需要跟踪2个不同的布尔变量,并正确处理空集合。
let valuesArray = [value1,value2,value3]
let valuesSet = Set(valuesArray)
if valuesSet.count == 1 || valuesSet.count == valuesArray.count {
// True
} else {
// False
}
如果此算法针对extension Sequence where Element: Equatable {
func classifyElementEquality() -> (allEqual: Bool,allUnequal: Bool) {
var iterator = self.makeIterator()
guard let first = iterator.next() else {
return (true,true) // all empty
}
return AnyIterator(iterator)
.reduce(into: (allEqual: true,allUnequal: true)) { acc,element in
if first == element {
acc.allUnequal = false
} else {
acc.allEqual = false
}
}
}
}
let (value1,value3) = (1,2,3)
let result = [value1,value3].classifyElementEquality()
if result.allEqual || result.allUnequal {
print("They're either all equal,or all unequal")
} else {
print("Some of them are different")
}
的{{1}}实例,则可以简化一点,因为访问第一个元素比较容易,而无需手动管理迭代器。
Collection