Verify there is a combination of unique string

前端 未结 4 1893
忘了有多久
忘了有多久 2021-01-21 12:17
class Details{
 String name;
 String age;
 String email;
 String location;
}

1) If there is List of Details as in List

how
相关标签:
4条回答
  • 2021-01-21 12:40

    If you need to achieve unique values-only, you should use Set. You have to use your own equals & hashCode implementation, for example, for case 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);
    }
    

    If you need all Details members to be unique just update hash & equals implementation with needed properties.

    0 讨论(0)
  • 2021-01-21 12:41

    You can hash values by a separator like #, and then find that all uniques or not. Hash value for a Details is name + "#" + "email in the first case, and is name + "#" + age + "#" + email + "#" + location in the second case. You can using Hashmap to find duplicates if there is any with the specified key (or hash) for each instance of Details.

    0 讨论(0)
  • 2021-01-21 12:41

    Besides of using a hash as propposed by @OmG, you could also use a TreeSet with the key being a concatenation of the unique fields, also using a separator between them.

    A Set only admits unique keys.

    0 讨论(0)
  • 2021-01-21 12:44

    When you overrides an equals method within any object, you can perfectly check the equality of that Object with another one even though they are residing somewhere different within the memory.

    So the below code

    myList.contains(myObject);

    will respond if there is an object within myList that the equals method return true with myObject.

    In all major IDEs (like intelliJ, netbeans, eclipse, etc) the IDE will help you to override the equals method accurately. here is the auto-generated code for overriding equals method using 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);
    }
    

    Now if you want to avoid duplicate to be added inside your List, you should use Set instead of a List. A Set will add a new element if the combination of hashCode and equals method are different (comparing the existing object and newly intended to add object)

    So we have to override hashCode method (generated by intelliJ IDE) if we want to use a flavor of Set class:

    @Override
    public int hashCode() {
        return Objects.hash(name, email);
    }
    

    now if you create a Set and try to add two objects with similar name and email inside that Set, the set will only add the first unique name and email address, even thou the other fields of the second object have different values

    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);
        }
    
    }
    

    This is the whole test app. There is something else that worth mentioning. if in any case you have saved your data inside a list and you want to remove the duplicate based on the rules you have (ex name, email) You can try this approach:

    Set<Details> mySet = new HashSet<>(myList);
    

    Which myList is your list. so in your app that will be like this:

    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);
    }
    

    and here is the result without any duplicate:

    [(name: Mehdi, age: 12, email: 123@xyz.com, location: Los Angeles)]

    0 讨论(0)
提交回复
热议问题