2D ArrayList Повторяет все Записи Java

#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 , поместить его в хэш-таблицу (или какую-либо другую структуру, использующую хэш-коды), а затем изменить имя или адрес клиента, что изменит его хэш-код. Когда вы попытаетесь найти этого клиента в хэш-таблице, вы не сможете вернуть его, потому что его хэш-код изменился.

Вы должны вычислять хэш-коды, используя только неизменяемые свойства.