我怎样才能确保在java

时间:2016-06-20 12:36:15

标签: java sorting collections unique

这是一个面试问题,我一片空白,没有任何想法。 假设我的Employee类有三个字段EmpIdEmpNameEmpAddress

现在我的工作是确保我创建的所有对象在EmpId的基础上都是唯一的,这样当我尝试创建两个具有相同EmpId的对象时,必须有一个机制停止/提醒我,可能是编译器警报或任何逻辑。

我在访谈中唯一能提出的问题是使用Map(即HashMap),密钥为EmpId以确保唯一性。 我知道DB中的主键可以确保这一点,但我如何在Java中处理它。

对此类线路的任何建议/想法都将不胜感激。

3 个答案:

答案 0 :(得分:1)

我可以想到很多方法。例如 1

  1. 使用将EmpId映射到Employee的传统Map。
  2. 使用一套EmpIds。
  3. 使用数据库表,其中每行代表一个Employee,EmpId是主键。
  4. 使用序列生成器 2 生成一系列唯一的EmpId值,并且不允许Employee对象构造函数的调用者提供EmpId。
  5. 如果EmpId是一个整数且空间很密集,请使用位图或BitSet而不是一组EmpIds。
  6. 如果EmpId是一个整数且空间非常密集,您可以使用TreeMap来表示EmpIds的范围。 (逻辑有点复杂。)
  7. 1 - 还有其他各种"穷人"我不会列举的解决方案。

    2 - 这并没有真正解决所述的问题。但是,这可能是你在实践中如何实现这一点的;例如使用SQL SEQUENCE。

答案 1 :(得分:0)

我认为您可以使用 HashSet 或类设置的另一种实现来解决您的问题,并且覆盖方法等于< / em>避免重复输入课程。

  来自类Set

的Java documentation

     

集合框架接口中的许多方法都是用术语定义的   等于方法。

N.B。 HashSet和Set实现接口集合

我将向您展示一个使用 contains

方法避免重复的示例
  来自方法的Java documentation

包含类

     

boolean contains(Object o)

     

如果此集合包含,则返回true   指定的元素。更正式地说,当且仅当这样时,返回true   集合包含至少一个元素e,使得(o == null?   e == null:o.equals(e))。

在此代码中,我使用静态HashSet来获得 Employee 的唯一列表。只有在成功将元素插入HashSet时,才能使用返回 true addToSet 方法在集合中插入元素。

import java.util.HashSet; 

public class Employee {
    private static HashSet<Employee> EmpSet= new HashSet<>();
    private String EmpId, EmpName, EmpAddress;

    public Employee(String id, String name, String addr){
        EmpId = id;
        EmpName = name;
        EmpAddress = addr;
    }

    public static boolean addToSet(Employee employee){  //this can be synchronized if you need
        if(EmpSet.contains(employee))
            return false;
        else
            EmpSet.add(employee);
        return true;
    }

    @Override
    public boolean equals(Object to_compare){
        if( !(to_compare instanceof Employee))
            return false;
        Employee other = (Employee) to_compare;
        return this.EmpId.equals(other.EmpId);
    }
}

如果EmpId为Integer或Long,则显示的代码也有效。 如果您从多个线程使用此类,则可以按照注释中的建议使方法 addToSet 同步。

如果您使用的数据库此代码无效,您可以找到针对该特定情况的特定方法。

修改 对不起,实际上你不需要方法addToSet,因为类 HashMap 的方法 add 完全相同,所以你可以使用它的方法或简单:

public static boolean addToSet(Employee employee){  //this can be synchronized if you need
                EmpSet.add(employee);
        }

答案 2 :(得分:0)

正如其他人所说,您可以使用MapSet来保存您的收藏集,并覆盖equalshashCode方法以确保正确使用集合。

如果您想检查对象的创建,您可以例如使用Map并抛出异常:

import java.util.Set;
import java.util.HashSet;    

public class Employee {

    private static Map<EmpID, Employee> employees = new HashMap<EmpID, Employee>();

    private EmpId empID;
    private EmpName empName;
    private EmpAddress address;

    public Employee(EmpID empID, EmpName empName, EmpAddress empAddress) throws NotUniqueIDException {            
        if(!employees.keySet().contains(empID) {
            this.empID = empID;
            this.empName = empName;
            this.empAddress = empAddress;
            employees.put(empID, this);
        } else {
            // Error
            throw NotUniqueIDException();
        }
    }

然后,在使用时:

try {
    Employee employee = new Employee(empID, empName, empAddress);
} catch(NotUniqueIDException exception) {
    // Do something here
}

至于您是否需要生成唯一ID,UUID.randomUUID()可能需要查看