【问题标题】:Can I have an ArrayList of type object that has a list of pointers to objects in Java?我可以拥有一个对象类型的 ArrayList,其中包含指向 Java 中对象的指针列表吗?
【发布时间】:2019-05-25 14:48:20
【问题描述】:

我目前有三个对象类,交易、用户和组。交易收集:id、支付者、日期、描述、金额和涉及的用户 ID 的 ArrayList。这完美地工作,但通过迭代用户的方法添加了许多代码行以查找哪个用户是谁。我的问题是,我可以有一个 ArrayList *partecipants = new ArrayList;哪个有所有用户的参考?

class Transaction{
    private static AtomicInteger count = new AtomicInteger(0);
    private int id = count.incrementAndGet();
    private String paid;
    private Date date;
    private String message;
    private Double amount;
    private ArrayList<Integer> users = new ArrayList<Integer>();

【问题讨论】:

  • 您的“多行代码”可能很容易被压缩——为什么不向我们展示您的相关minimal reproducible example 代码?
  • 是的,但以拥有 100 万用户为例。查找具有该 ID 的那个是非常低效的迭代。所以我认为在那个 ArrayList 中引用用户会更好。我知道它可以在 C 中完成,但我对 java 知之甚少。
  • public String getUserName(int id){//done String name=null; for(用户用户: general.users){ if(user.get_id()==id){ name=user.get_name();休息; } } if(name==null){ ambrogio.sendText("错误");返回空值; }else{ 返回名称; } }
  • 听起来你想要Map,类似于Map&lt;Integer, String&gt; usersById = new HashMap&lt;&gt;();
  • 一个Map,就像我建议的那样,可以做到这一点。没有迭代,只做String userName = usersById.get(id)

标签: java pointers reference


【解决方案1】:

一个简短的例子:

假设你有一个简单的User 类:

public class User {
    private int id;
    private String name;

    // etc
}

假设您最初有一个List

List<User> users;

通过 id 查找用户可以这样完成:

users.stream().filter(u -> u.getId() == id).findFirst();

但是,如果用户列表很大,可能会很慢。

您可以将用户存储在Map

Map<Integer, User> usersById;

这张地图只会引用其他对象,因此占用的空间很小(但仍会占用一些空间,就像索引一样)。

你可以这样填写这张地图:

usersById = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));

或者更传统的:

usersById = new HashMap<>();

for(User u : users) {
    usersById.put(u.getId(), u);
}

现在要通过 id 查找用户,您可以使用这个(具有 O(1) 性能):

User user = usersById.get(id);

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2023-02-09
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2020-12-11
    • 2023-03-26
    • 2021-08-25
    相关资源
    最近更新 更多