验证是否存在唯一字符串的组合

时间:2018-12-01 12:39:40

标签: java algorithm scala data-structures

// 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)如何验证类文件中所有字段的组合是否唯一。

什么是解决此问题的理想数据结构?

4 个答案:

答案 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.contains(myObject);

如果在myList中存在一个对象,则equals方法对myObject返回true,

将作出响应。

在所有主要的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仅接受唯一密钥。