2017-02-22 18 views
1

Я пытаюсь получить правильный вывод для методов «содержать» и «lastIndexOf» с помощью String, но он не даст мне правильный вывод для тех, в этом случае false или true для «содержать» и позицию элемента для «lastIndexOf». Как я могу это сделать, пожалуйста? Огромное спасибо.ArrayList - получить «Contain» и «lastIndexOf» с помощью String

public class Employee { 
    public static final int size = 0; 
    String firstName; 
    String surname; 
    int yearOfBirth; 
    String PPSNumber; 
    String email; 
    String phoneNumber; 

    public Employee(String firstName, String surname, int yearOfBirth, String PPSNumber, String email, String phoneNumber) { 
     this.firstName = firstName; 
     this.surname = surname; 
     this.yearOfBirth = yearOfBirth; 
     this.PPSNumber = PPSNumber; 
     this.email = email; 
     this.phoneNumber = phoneNumber; 
    } 
} 

// ____________________________________________________ //

import java.util.ArrayList; 

public class EmployeeManagement { 
    public static void main(String[] args) { 
     ArrayList<Employee> employeeList = new ArrayList<>(); 

     employeeList.add(new Employee("Charlie", "Charles", 1991, "234567b", "[email protected]", "7654321")); 
     employeeList.add(new Employee("David", "Davies", 1992, "5213452d", "[email protected]", "352135613")); 
     employeeList.add(new Employee("Levi", "Silva", 1990, "1234", "[email protected]", "333333")); 
     employeeList.add(new Employee("Gus", "Silva", 1993, "4321", "[email protected]", "444444")); 

     for (Employee getName : employeeList) { 

      System.out.print(getName.firstName + ",   "); 

     } 

     System.out.println(" "); 

     // contains(Employee) 
     Employee Emp = new Employee("Gus", "Silva", 1993, "4321", "[email protected]", "444444"); 
     System.out.println("Contains String: " + employeeList.contains(Emp)); // can't make give me the right contain answer 


     // lastIndexOf()  
     Employee Charlie1 = new Employee("Charlie", "Charles", 1991, "234567b", "[email protected]", "7654321"); 
     System.out.println("lastIndexOf: " + employeeList.lastIndexOf(Charlie1)); // can't find the lastIndexOf 


    } 
} 
+0

Я не могу найти ваш вызов 'ArrayList.contains (*)' в вашем коде (при условии, что это метод, о котором вы говорите). Можете ли вы указать на это? – SantiBailors

+0

Только что изменил код, теперь вы можете увидеть содержимое, я исправил тип объекта, но все еще не работает. – Josh

+0

См. Мои комментарии в моем ответе. – SantiBailors

ответ

2

Вы должны реализовать equals и hashCode в Employee (или любой другой класс для того, чтобы contains, sort или другие методы работает.

Например , этот мастер по умолчанию по умолчанию использует все поля:

class Employee { 
    public static final int size = 0; 
    String firstName; 
    String surname; 
    int yearOfBirth; 
    String PPSNumber; 
    String email; 
    String phoneNumber; 

    public Employee(String firstName, String surname, int yearOfBirth, String PPSNumber, String email, String phoneNumber) { 
     this.firstName = firstName; 
     this.surname = surname; 
     this.yearOfBirth = yearOfBirth; 
     this.PPSNumber = PPSNumber; 
     this.email = email; 
     this.phoneNumber = phoneNumber; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Employee employee = (Employee) o; 

     if (yearOfBirth != employee.yearOfBirth) return false; 
     if (firstName != null ? !firstName.equals(employee.firstName) : employee.firstName != null) return false; 
     if (surname != null ? !surname.equals(employee.surname) : employee.surname != null) return false; 
     if (PPSNumber != null ? !PPSNumber.equals(employee.PPSNumber) : employee.PPSNumber != null) return false; 
     if (email != null ? !email.equals(employee.email) : employee.email != null) return false; 
     return phoneNumber != null ? phoneNumber.equals(employee.phoneNumber) : employee.phoneNumber == null; 
    } 

    @Override 
    public int hashCode() { 
     int result = firstName != null ? firstName.hashCode() : 0; 
     result = 31 * result + (surname != null ? surname.hashCode() : 0); 
     result = 31 * result + yearOfBirth; 
     result = 31 * result + (PPSNumber != null ? PPSNumber.hashCode() : 0); 
     result = 31 * result + (email != null ? email.hashCode() : 0); 
     result = 31 * result + (phoneNumber != null ? phoneNumber.hashCode() : 0); 
     return result; 
    } 
} 

Теперь просто добавьте только нужные или обязательные поля, и вы увидите, как работает contains.

0

Ваш employeeList объявлен как ArrayList<Employee>, так что ваши employeeList.lastIndexOf("Gus") не будет работать, потому что список содержит Employee объекты, а "Gus" является String поэтому нет нигде в списке.

О «содержать», я не могу найти ваш вызов ArrayList.contains(*) в вашем коде (при условии, что это метод, о котором вы говорите). Можете ли вы указать на это?

+0

Я изменил код только на то, что мне действительно нужно, и зафиксировал тип объекта «Сотрудник», это была строка раньше. Коды, которые я получил здесь, но не так, как я работал, поскольку я исправил тип объект? Благодарю. – Josh

+0

@ Gab 'contains' и' lastIndexOf' должны быть в состоянии определить, являются ли два экземпляра 'Employee' равными. Они делают это, вызывая 'equals' на' Employee'. Итак, как говорится в принятом ответе, вам нужно переопределить 'equals' (и' hashCode') в вашем классе Employee, и поместите туда логику, которую вы хотите использовать, чтобы определить, равны ли два 'Employee'. Тогда как 'contains', так и' lastIndexOf' будут работать так, как вы ожидаете. Просто интересно, что вы на самом деле подразумеваете под «содержит»: что он содержит сотрудника с той же фамилией? Или же адрес электронной почты? Или с одинаковыми значениями во всех этих полях? Поместите эту логику в «Employee.equals». – SantiBailors

+0

@Gab О том, почему всегда следует переопределять 'hashCode' при переопределении' equals', вы можете увидеть [этот ответ] (http://stackoverflow.com/a/2265637/2814308). Переопределение «hashCode» не требуется, если только код в вашем примере касается, но этот код, безусловно, является частью более крупного приложения, поэтому это не имеет значения, а не переопределение «hashCode» было бы плохой идеей, если вы переопределите 'equals'. – SantiBailors

1

Как указано в the javadoc of lastIndexOf, вы получаете -1, если объект не найден. Но причина, по которой он не найден, заключается в том, что вы имеете дело со списком Employee, а не со списком String. Вы могли бы, конечно, реализовать equals и hashCode на вашем классе Employee, но таким образом вы недостаточно гибки. Вместо этого вам следует просто отфильтровать список для требуемых элементов, например.

// Get (or show) all employees, whose name is "some string" using Stream API 
employeeList.stream() 
      .filter(employee -> employee.firstName.contains("some string")) 
      .collect(Collectors.toList()); // or: .forEach(System.out::println); 

О получении последнего указателя вашей записи .... вам действительно нужна такая функциональность? Если да, и у вас нет фактического объекта для запроса (объект Employee «Gus»), и вы не хотите реализовывать hashCode и equals, я предлагаю, чтобы вы просто перебирали список и break в первом случае:

int lastIndex = -1; 
for (int i = employeeList.size() - 1; i >= 0 ; i--) { 
    Employee anEmployee = employeeList.get(i); 
    if (anEmployee.firstName.equals("Gus")) { 
    lastIndex = i; 
    break; 
} 
} 
System.out.printf("lastIndexOf: %s%n", lastIndex); 
+0

Я полагаю, что не использовать hashCode и равно, просто изменил код, фиксирующий тип объекта, но все еще не работает. – Josh

+0

Если вы внедрили equals и hashCode правильно, тогда ваш код должен работать. Однако то, что вы делаете, похоже, является фильтрацией/поиском. Тогда я не буду полагаться на equals/hashCode, но вместо этого будет фильтровать список в зависимости от ваших критериев фильтра. – Roland

Смежные вопросы