当前位置: 首页 > 知识库问答 >
问题:

如何在HashMap中以迭代id为键存储特定对象

齐俊达
2023-03-14

我正在做一个程序。我将用户存储在ArrayList中,所以我有一个UserCollection类作为用户的储存类别。但是鉴于UserCollection被认为是一个数据库,数据库中的每个用户条目都应该有一个唯一的id。最初我有一个userID作为User类中的字段,但现在我试图处理UserCollection中的id部分。如果我使用一个hashmap,其中键将是id,值是User我将如何继续迭代id,以便每次一个新的User被存储到hashmap中,他们键保持从1到n的迭代量的用户。我也使用CRUD方法来存储/删除/更新用户等。

public class UserCollection{

Map<Integer, User> userMap = new HashMap<Integer,User>();

public User create(User user){
 userMap.put(??,user) // not sure how to iterate the id or what to put in it
 return user;
}

public User read(Integer keyID){
  if(userMap.containsKey(keyID)){
     return userMap.get(keyID); //something definitely wrong
  }
}

//Other remaining CRUD methods after. 

}

最初,我只是有一个ArrayList,其中包含用户。但因为我意识到在数据库中,用户将拥有唯一的id,所以我不知道如何处理它们。如果我在HashMap中处理它们,我还需要在用户类中有一个userID字段吗?

共有2个答案

华坚成
2023-03-14

您可以执行以下操作以确保您的用户在类的生命周期中具有唯一的ID。

public class UserCollection
{
   private static int id = 0;
   private static final Object lock = new Object();

   private Map<Integer, User> userMap = new HashMap<Integer,User>();

   public User create (User user)
   {
     // only add one user at a time to the map
     synchronized (lock)
     {
        id++;
        userMap.put(id, user);
     }
     return user;
   }

   // Rest of the class
}
靳涵亮
2023-03-14

你在这里问了几个问题。我将依次接受他们中的每一个:

  1. 如何确保每个用户都有唯一的ID

最简单的方法是使用一个静态字段来跟踪生成的最大id:

class User {
    private static int largestID = 0;
    private final int id = largestID++;

    public int getID() {
        return id;
    }
    ...
}

这是可行的,但有很多问题。只要你存储用户

另一种方法是从您的收藏中为现有客户找到最大的id。以下示例代码使用Java 8:

class UserCollection {
    private final Map<Integer,User> users = new HashMap<>();

    public int nextID() {
        return users.keySet().stream()
            .mapToInt(n -> n).max().orElse(-1) + 1;
    }
}

这是低效的,但对许多应用程序来说可能已经足够好了。

你有两个选择。或者将其存储在类中,并提供获取ID的机制(如上所述)。或者确保与用户相关的所有内容都存储并返回ID,而不是对对象的引用。这允许该方法的客户端使用该ID访问用户。

这两个都是合法的解决方案。如果使用第一个(将ID存储在类中),则应更改将用户添加到集合的方法:

class UserCollection {
    public void addUser(User user) {
        users.put(user.getID(), user);
    }
}

如果使用第二个字段,则ID字段必须是最终字段,因为客户端依赖于它而不会更改。

 类似资料:
  • 问题内容: 我有一个HashMap,每次我获得迭代器时,我都希望以不同的随机顺序迭代它们的键值对。从概念上讲,我想在调用迭代器之前对地图进行“混洗”(或者,如果需要,可以对迭代器进行“混洗”)。 我有两种选择: 1)使用LinkedHashMap的方法,并在内部保留条目列表,将其随机洗净,并在调用迭代器时返回该视图。 2)使用map.entrySet(),构造一个ArrayList并在其上使用sh

  • 有点初学者的问题但是... 我有一个从数据库返回的ResultSet对象-3列30行。 我检索以下数据集: null 我知道这应该不难,我只是在努力寻找迭代HashMaps的ArrayList的最佳方法

  • 在javascript函数中尝试通过传递键迭代映射时,如下所示: 我得到的是空白值。但是当我硬编码key***user1***的值时,它就起作用了。 有人能帮我一下吗?

  • 我正在尝试迭代作为参数传递给jrxml的<code>HashMap</code>的值,在<code>HashMap</code>中,这些值作为<code>List</code>传递。 例 我如何在jasper report Jr XML中迭代这些< code>List?

  • 问题是如何使用方法在HashMap中pritn值=1的图书?在代码中,ive删除了数组中的书籍,这样代码就可以更短。

  • 我想为可用于查询地图的每个键获取“规范”键对象。看这里: HashMap使用的是相同的多个唯一对象。所以我想从地图中获取实际的密钥,无论使用哪个对象来查询地图,它都将始终是相同的。 有没有办法从地图中获取实际的关键对象?我在界面上看不到任何东西,但可能是我忽略了一些聪明的技巧? (迭代所有条目或键不算数。)