#java #arraylist
Вопрос:
Я пытаюсь создать 2D-список массивов, но каждая запись, которую я делаю, добавляется к одной записи, а затем повторяется. По сути, вместо получения [[a, b, c], [d, e, f]] я получаю [[a, b, c, d, e, f], [a, b, c, d, e, f]]. Вот мой код в отношении моей проблемы.
public class Customer { private String customerId; private String name; private String address; private String phoneNumber; public Customer(String customerId, String name, Address address, String phoneNumber) { this.customerId = customerId; this.name = name; this.address = address.getAddressInfo(); this.phoneNumber = phoneNumber; } public String getCustomerId() { return customerId; } public void setCustomerId(String customerId) { this.customerId = customerId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(Address address) { this.address = address.getAddressInfo(); } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result ((address == null) ? 0 : address.hashCode()); result = prime * result ((customerId == null) ? 0 : customerId.hashCode()); result = prime * result ((name == null) ? 0 : name.hashCode()); result = prime * result ((phoneNumber == null) ? 0 : phoneNumber.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Customer other = (Customer) obj; if (address == null) { if (other.address != null) return false; } else if (!address.equals(other.address)) return false; if (customerId == null) { if (other.customerId != null) return false; } else if (!customerId.equals(other.customerId)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (phoneNumber == null) { if (other.phoneNumber != null) return false; } else if (!phoneNumber.equals(other.phoneNumber)) return false; return true; } public String toString() { return String.format("ID: %s, Name: %s, Address: %s, Phone: %s", customerId, name, address, phoneNumber); } }
import java.util.ArrayList; import java.util.List; public class ParkingOffice { private String name; private String address; private Listlt;Listlt;Customergt;gt; customers = new ArrayListlt;gt;(); private Listlt;Customergt; customerList = new ArrayListlt;gt;(); public ParkingOffice(String name, Address officeAddress) { this.name = name; this.address = officeAddress.getAddressInfo(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(Address address) { this.address = address.getAddressInfo(); } public Listlt;Listlt;Customergt;gt; getCustomers() { return customers; } public void setCustomers(Listlt;Listlt;Customergt;gt; customers) { this.customers = customers; } public Listlt;Customergt; getCustomerList() { return customerList; } public void setCustomerList(Listlt;Customergt; customerList) { this.customerList = customerList; } public Customer register(String customerId, String name, Address address, String phone) { Customer customer = new Customer(customerId, name, address, phone); customer.addCustomers(); this.customerList.add(customer); this.customers.add(this.customerList); return customer; } }
import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; class ParkingOfficeTest { Address address = new Address("123 Lane", null, "Anaheim", "CA", "92801"); Customer customer = new Customer("7g8h9i", "Jane", address, "987654321"); Customer customer2 = new Customer("4d5e6f", "Joe", address, "987654321"); @Test void testRegisterCustomer() { parkingOffice.register(customer.getCustomerId(), customer.getName(), address, customer.getPhoneNumber()); parkingOffice.register(customer2.getCustomerId(), customer2.getName(), address, customer2.getPhoneNumber()); Listlt;Listlt;Customergt;gt; customers = parkingOffice.getCustomers(); assertEquals("[[ID: 7g8h9i, Name: Jane, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321], [ID: 4d5e6f, Name: Joe, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321]]", customers); } }
Expected: [[ID: 7g8h9i, Name: Jane, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321], [ID: 4d5e6f, Name: Joe, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321]] Actual: [[ID: 7g8h9i, Name: Jane, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321, ID: 4d5e6f, Name: Joe, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321], [ID: 7g8h9i, Name: Jane, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321, ID: 4d5e6f, Name: Joe, Address: 123 Lane, Anaheim, CA 92801, Phone: 987654321]]
Заранее благодарим вас за любые отзывы и помощь.
Комментарии:
1. Вы никогда не создавали новое
customerList
нигде в своем коде. У вас есть только инициалListlt;Customergt;
, созданный в инициализатореParkingOffice
класса. Вы никогда не устанавливаете эту переменную на что-то новое.
Ответ №1:
У вас ParkingOffice
есть customerList
свойство, которое представляет собой список объектов клиента. У него также есть customers
свойство, которое, я думаю, является 2D-списком, о котором вы спрашиваете.
Когда вы регистрируете клиента, вы добавляете его customerList
, что имеет смысл. Но затем вы также добавляете этот список ( customerList
) в свой 2D-список ( customers
).
Таким образом, для каждого нового клиента вы добавляете новый элемент в каждый из этих двух списков: customerList
получаете нового клиента и customers
получаете новый элемент, на который указывает customerList
. Потому customers
что вы создаете массив, который выглядит так [ customerList, customerList, ... ]
Неясно, что customers
должно храниться, но я подозреваю, что вы могли бы просто сконструировать его по запросу. Таким образом getCustomers()
, вы могли бы вернуть новый список с одним элементом, указывающим на ваш customerList
.
Я также хочу отметить, что у вас есть небольшая ошибка, касающаяся хэш-кодов. Вы вычисляете хэш-код с Customer
использованием изменяемых свойств. Это означает , что кто-то может создать экземпляр Customer
, поместить его в хэш-таблицу (или какую-либо другую структуру, использующую хэш-коды), а затем изменить имя или адрес клиента, что изменит его хэш-код. Когда вы попытаетесь найти этого клиента в хэш-таблице, вы не сможете вернуть его, потому что его хэш-код изменился.
Вы должны вычислять хэш-коды, используя только неизменяемые свойства.