Выравнивание двух списков в Java - PullRequest
0 голосов
/ 28 октября 2019

У меня есть два списка (personList из БД и inputPersonList из пользовательского интерфейса). Я хочу убедиться, что каждая строка в personList находит (соответствует) соответствующую строку в inputPersonList по id (без сортировки)

Person person1=new Person();
Person person2=new Person();
Person person1=new Person();
List<Person> personList=new ArrayList();
List<Person> inputPersonList=new ArrayList();

person1.Id(1);
person1.setName("A");
person1.setFamily("B");

person2.Id(2);
person2.setName("C");
person2.setFamily("D");

person3.Id(3);
person3.setName("E");
person3.setFamily("F");

personList.add(person1);
personList.add(person2);
personList.add(person3);

inputPersonList.add(person1);
inputPersonList.add(person3);
inputPersonList.add(person2);

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Предполагая, что ваш список содержит пользовательский объект. Если это так, просто перезапишите метод compareTo в вашем пользовательском объекте, а затем выполните итерацию по List, проверяя каждый соответствующий элемент.

Например:

Вот пользовательский объект Book, который implements Comparable:

public class Book implements Comparable {

String isbn;
String title;

public Book(String id, String title) {
    this.isbn = id;
    this.title = title;
}

String getIsbn() {
    return isbn;
}

String getTitle() {
    return title;
}

@Override
public int compareTo(Object o) {
    return Comparator
            .comparing(Book::getIsbn)
            .thenComparing(Book::getTitle)
            .compare(this, (Book) o);
}

@Override
public  String toString() {
    String output = new StringBuilder()
            .append(isbn).append(":").append(title)
            .toString();
    return output;
}

}

Следующее создает два списка (для представления списка БД и списков пользовательского интерфейса). ), а затем сравнивает их по позиции в списке (а именно «соответствующая строка»):

 public void CompareTwoLists(){
    List<Book> libraryUI = new ArrayList<>();
    libraryUI.add(new Book("9780593098240", "Children of Dune"));
    libraryUI.add(new Book("9780593098233", "Dune Messiah"));
    libraryUI.add(new Book("9780441172719", "Dune"));

    List<Book> libraryDB = new ArrayList<>();
    libraryDB.add(new Book("9780593098240", "Children of Dune"));
    libraryDB.add(new Book("9780593098233", "Dune Messiah"));
    libraryDB.add(new Book("9788886845687", "God Emperor of Dune"));

    boolean theSame = Boolean.TRUE;
    if(libraryDB.size() != libraryUI.size()) {
        theSame = Boolean.FALSE;
    } else {
        for(int i = 0; i < libraryDB.size(); i++) {
            if (libraryDB.get(i).compareTo(libraryUI.get(i)) != 0) {
                theSame = Boolean.FALSE;
                break;
            }
        }
    }
    if(theSame) {
        System.out.println("The same");
    } else {
        System.out.println("Not the same");
    }
}
0 голосов
/ 28 октября 2019

Как говорит Ambro-r, вам нужно использовать интерфейс Comparable, но если у вас нет доступа к сущности, вам следует расширить класс книги.

public class MyBook extends Book implements Comparable {

@Override
public int compareTo(Object o) {
    //compare with other book with the attributes what you want maybe could:
    return this.isbn > ((MyBook) o).isbn
}

@Override
public  String toString() {
   //return super.toString() or your own toString 
}


Затем вы должны создать списки объектов MyBook.

0 голосов
/ 28 октября 2019

Что вы можете сделать, это проверить, содержит ли каждый из двух списков все элементы другого списка и их размер равен:

public static void main(String[] args) throws ParseException {
    Person person1 = new Person();
    Person person2 = new Person();
    Person person3 = new Person();
    List<Person> personList = new ArrayList<>();
    List<Person> inputPersonList = new ArrayList<>();

    person1.Id(1);
    person1.setName("A");
    person1.setFamily("B");

    person2.Id(2);
    person2.setName("C");
    person2.setFamily("D");

    person3.Id(3);
    person3.setName("E");
    person3.setFamily("F");

    personList.add(person1);
    personList.add(person2);
    personList.add(person3);

    inputPersonList.add(person1);
    inputPersonList.add(person3);
    inputPersonList.add(person2);

    // compare the lists using the built-in "equals()" method, which considers order of elements
    System.out.println(personList.equals(inputPersonList) ?
            "equal (considering order)" : "not equal (considering order)");
    // then compare them with the other possibility
    System.out.println(areEqual(personList, inputPersonList) ?
            "equal (without considering order)" : "not equal (without considering order)");

}

public static boolean areEqual(List<Person> persons, List<Person> personsToo) {
    if (persons.containsAll(personsToo) && personsToo.containsAll(persons)
            && persons.size() == personsToo.size()) {
        return true;
    } else {
        return false;
    }
}

Имейте в виду, что это делаетне правильно рассматривать случай дублирующихся элементов, потому что он только проверяет, присутствует ли элемент в обоих списках, а не равен ли их счет в списках. Вы можете добавить person1 во второй раз к personList и person3 во второй раз к imputPersonList, и результат все равно будет равен true соответственно равенству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...