Могу ли я иметь ArrayList типа объекта, который имеет список указателей на объекты в Java? - PullRequest
0 голосов
/ 25 мая 2019

В настоящее время у меня есть три класса объектов: Транзакция, Пользователь и Группа. Транзакция собирает: идентификатор, кто заплатил, дату, описание, сумму и 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>();

1 Ответ

0 голосов
/ 25 мая 2019

Краткий пример:

Допустим, у вас есть простой User класс:

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

    // etc
}

И, скажем, у вас изначально есть List из них:

List<User> users;

Найти пользователя по идентификатору можно следующим образом:

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

Чтобы найти пользователя по идентификатору сейчас, вы можете использовать это (с O(1) производительностью):

User user = usersById.get(id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...