按Java键对HashMap排序

按Java键对HashMap排序,java,Java,我试图创建一个HashMap,其中键(intid)是通过查找前面的数字+1来确定的 我对java比较陌生,我在其他文章中看到的例子看起来很混乱 我的现行守则: public class Office { private Map<Integer, Employee> employee = new HashMap<>(); /** * Constructor for objects of class Office */ public Off

我试图创建一个HashMap,其中键(
intid
)是通过查找前面的数字+1来确定的

我对java比较陌生,我在其他文章中看到的例子看起来很混乱

我的现行守则:

public class Office
{
   private Map<Integer, Employee> employee = new HashMap<>();

   /**
    * Constructor for objects of class Office
    */
   public Office()
   {
      employee = new HashMap<>();
   }

   public void addOffice(int ID, String Name, String JobTitle, int Age, int Salary)
   {
      Employee e = new Employee(ID, Name, JobTitle, Age, Salary);
      employee.put(ID, e);
   }

   public int getID()
   {
      #find info
   }
}
我看过甲骨文的网站,但对它一无所知

谢谢,
Sam

如果您只需要一个唯一的ID作为密钥,您可以使用系统时间戳,例如从
system.CurrentTimeMillis()
。或者您甚至可以通过调用
java.util.UUID.randomuid()
来使用随机生成的UIID

如果您仍然想要增量键,那么您必须创建一个方法,该方法尝试查找最大键值并将其增量。 这是一个相关的问题:


如果您的类同时被多个线程使用,请注意线程安全。

如果您只需要一个唯一的ID作为密钥,则可以使用系统时间戳,例如从
system.CurrentTimeMillis()
。或者您甚至可以通过调用
java.util.UUID.randomuid()
来使用随机生成的UIID

如果您仍然想要增量键,那么您必须创建一个方法,该方法尝试查找最大键值并将其增量。 这是一个相关的问题:


如果您的类同时被多个线程使用,请注意线程安全。

如果您不需要删除员工,您可能只需要为此使用一个列表:

public class Office
{
   private final List<Employee> employees = new LinkedList<>(); //or ArrayList

   public Office()
   {
      // do nothing
   }

   // FYI variables should start with a lowercase character
   public void addOffice(String name, String jobTitle, int age, int salary)
   {
      Employee e = new Employee(employees.size(), name, jobTitle, age, salary);
      employees.add(e);
   }
}
公共班级办公室
{
private final List employees=new LinkedList();//或ArrayList
公职()
{
//无所事事
}
//仅供参考,变量应以小写字符开头
public void addOffice(字符串名称、字符串职务、整数年龄、整数工资)
{
员工e=新员工(employees.size()、姓名、职称、年龄、工资);
增加(e);
}
}

如果不需要删除员工,您可能只需要使用一个列表:

public class Office
{
   private final List<Employee> employees = new LinkedList<>(); //or ArrayList

   public Office()
   {
      // do nothing
   }

   // FYI variables should start with a lowercase character
   public void addOffice(String name, String jobTitle, int age, int salary)
   {
      Employee e = new Employee(employees.size(), name, jobTitle, age, salary);
      employees.add(e);
   }
}
公共班级办公室
{
private final List employees=new LinkedList();//或ArrayList
公职()
{
//无所事事
}
//仅供参考,变量应以小写字符开头
public void addOffice(字符串名称、字符串职务、整数年龄、整数工资)
{
员工e=新员工(employees.size()、姓名、职称、年龄、工资);
增加(e);
}
}

为什么不使用?(TreeMap implements)谢谢@Michael那么我怎么能提取最后一个
值?如果你想要一个
1->{a},2->{b},3->{c}
的映射,那不就是一个列表吗…?@SCramphorn我已经添加了一个答案。你为什么不使用?(TreeMap implements)谢谢@Michael,那么我如何提取最后一个
值呢?如果你想要一个
1->{a},2->{b},3->{c}
的映射,这不只是一个列表吗?@SCramphorn我已经添加了一个答案。这两个都容易受到随机冲突的影响。这不是一个好的解决方案。UUID不能有冲突,当前时间戳-如果不经常使用map,可能是一个解决方案,即仅在用户的actionUUID上最肯定会有冲突,这是不可能的。在Java中,可以表示的整数或long数可能太多了,所以如果您经常调用UUID,这是不可避免的。仅仅增加计数器和使用UUID之间的关键区别在于,达到计数器的最大限制是可预测的,而获得UUID冲突则不是。这两者都容易受到随机冲突的影响。这不是一个好的解决方案。UUID不能有冲突,当前时间戳-如果不经常使用map,可能是一个解决方案,即仅在用户的actionUUID上最肯定会有冲突,这是不可能的。在Java中,可以表示的整数或long数可能太多了,所以如果您经常调用UUID,这是不可避免的。仅仅增加计数器和使用UUID之间的关键区别在于,达到计数器的最大限制是可以预测的,而获得UUID冲突则不是。谢谢@Michael。最后一个问题,“Final”的意义在于与c#中的
const
相同?我对c#不熟悉,但可能。这意味着变量只能指向一个对象。在这种情况下,它永远不会指向另一个列表。一个对象可能会改变(例如,添加或从列表中删除),因此说它是“常量”并不正确。更确切地说,它是对一个对象的恒定引用,这个对象可能是恒定的,也可能不是恒定的。谢谢@Michael。最后一个问题,“Final”的意义在于与c#中的
const
相同?我对c#不熟悉,但可能。这意味着变量只能指向一个对象。在这种情况下,它永远不会指向另一个列表。一个对象可能会改变(例如,添加或从列表中删除),因此说它是“常量”并不正确。相反,它是对一个对象的常量引用,这个对象可能是常量,也可能不是常量。