// Dynamic binding to on 'click' and Toggle the nested nav
$('.nav-list').on('click', '.nav-click', function(){
$('.nav-submenu').not($(this).siblings('.nav-submenu')).hide();
$('.nav-item .nav-click').not(this).removeClass('icon-close');
$(this).siblings('.nav-submenu').toggle();
$(this).toggleClass('icon-close');
});
1)如果class Details{
String name;
String age;
String email;
String location;
}
中有详细信息列表,则如何验证姓名和电子邮件的组合是否唯一。 (即)对于一个电子邮件地址,不能输入两个名称。
2)如何验证类文件中所有字段的组合是否唯一。
什么是解决此问题的理想数据结构?
答案 0 :(得分:6)
您可以使用#
之类的分隔符来散列值,然后查找是否所有唯一性。 Details
的哈希值在第一种情况下为name + "#" + "email
,在第二种情况下为name + "#" + age + "#" + email + "#" + location
。
您可以使用Hashmap
查找每个Details
实例具有指定键(或哈希值)的重复项。
答案 1 :(得分:3)
如果仅需要实现唯一值,则应使用Set。您必须使用自己的equals&hashCode实现,例如对于案例1):
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Details details = (Details) o;
return Objects.equals(name, details.name) &&
Objects.equals(email, details.email);
}
@Override
public int hashCode() {
return Objects.hash(name, email);
}
如果您需要所有Details成员都是唯一的,则只需更新哈希和等于具有所需属性的实现即可。
答案 2 :(得分:3)
当您在任何对象中覆盖equals方法时,即使它们位于内存中不同的位置,也可以完美地检查该对象与另一个对象的相等性。
所以下面的代码
如果在myList中存在一个对象,则equals方法对myObject返回true,myList.contains(myObject);
将作出响应。
在所有主要的IDE(例如intelliJ,netbeans,eclipse等)中,IDE都会帮助您准确地覆盖equals方法。这是使用 intelliJ IDE
覆盖等号方法的自动生成的代码@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Details details = (Details) o;
return Objects.equals(name, details.name) &&
Objects.equals(email, details.email);
}
现在,如果要避免在列表中添加重复项,则应使用 Set 而不是 List 。 A hashCode 和 equals 方法的组合不同(比较现有对象和新设计的对象),则> Set 将添加一个新元素添加对象)
因此,如果要使用 Set 类的样式,则必须重写hashCode方法(由intelliJ IDE生成):
@Override
public int hashCode() {
return Objects.hash(name, email);
}
现在,如果您创建一个Set并尝试在该Set中添加名称和电子邮件相似的两个对象,则该Set仅会添加第一个唯一的名称和电子邮件地址,即使第二个对象的其他字段都具有不同的值
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
class Details {
String name;
String age;
String email;
String location;
public Details(String name, String age, String email, String location) {
this.name = name;
this.age = age;
this.email = email;
this.location = location;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Details details = (Details) o;
return Objects.equals(name, details.name) &&
Objects.equals(email, details.email);
}
@Override
public int hashCode() {
return Objects.hash(name, email);
}
@Override
public String toString() {
return String.format("(name: %s, age: %s, email: %s, location: %s)", name, age, email, location);
}
public static void main(String[] args) {
Set<Details> mySet = new HashSet<>();
mySet.add(new Details("Mehdi", "12", "123@xyz.com", "Los Angeles"));
mySet.add(new Details("Mehdi", "34", "123@xyz.com", "Las Vegas"));
System.out.println(mySet);
}
}
这是整个测试应用程序。还有其他值得一提的地方。无论如何,如果您已将数据保存在列表中,并且想要根据已有的规则(例如姓名,电子邮件)删除重复项,则可以尝试以下方法:
Set<Details> mySet = new HashSet<>(myList);
哪个myList是您的列表。在您的应用程序中将如下所示:
public static void main(String[] args) {
List<Details> myList = new ArrayList<>();
myList.add(new Details("Mehdi", "12", "123@xyz.com", "Los Angeles"));
myList.add(new Details("Mehdi", "34", "123@xyz.com", "Las Vegas"));
Set<Details> mySet = new HashSet<>(myList);
System.out.println(mySet);
}
这是没有重复的结果:
[((姓名:Mehdi,年龄:12,电子邮件:123@xyz.com,位置:洛杉矶)]
答案 3 :(得分:1)
除了使用@OmG提议的哈希之外,还可以使用 TreeSet ,其键是唯一字段的串联,也可以在它们之间使用分隔符。
Set
仅接受唯一密钥。