Как сравнить значения ключей в java Set - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь найти лучший способ отсортировать эти два набора. Я пытаюсь использовать свойство clientName из набора 1 и свойство name из набора 2, чтобы создать список имен.

Я пытаюсь создать следующие случаи:

  1. получить список имен, которые совпадают между набором 1 и набором 2.
  2. получить список имен, которые не совпадают между набором 2 и набором 1.

Set 1

[
  BaseAdapter.CreateClient(clientName=jon smith, email=email@email.com, location=null, isCompliant=null), 
  BaseAdapter.CreateClient(clientName=jane doe, email=email@email.com, location=null, isCompliant=null)
]

Set 2

[Endpoint(id=id1, name=jon smith), Endpoint(id=id2, name=jon doe)]

Если бы я просто использовал пересечение наборов, я бы получил (jon doe, jane doe).

Любая помощь была бы очень оценен.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

На самом деле это не ответ, но он также не подходит для комментария.

В вашем первом случае вам нужны общие элементы из двух отдельных наборов. Это называется пересечением двух множеств. Интерфейс Set объявляет метод retainAll(), который дает вам пересечение двух наборов.

Во втором случае вам нужна разница между двумя наборами. И снова интерфейс Set объявляет метод removeAll().

Однако, согласно информации в вашем вопросе, похоже, что каждый набор содержит разные типы элементов. Я предполагаю, что первый набор содержит экземпляры BaseAdapter, а второй набор содержит экземпляры EndPoint.

Итак, чтобы использовать методы retainAll() и removeAll(), оба набора должны содержать одинаковые тип элемента. Вы можете решить эту проблему, заставив каждый класс - BaseAdapter и EndPoint - реализовывать один и тот же интерфейс. Обратите внимание, что этот интерфейс должен быть только интерфейсом маркера, т. Е. Интерфейсом, который не объявляет никаких методов, например Serializable. Также обратите внимание, что вам не обязательно использовать интерфейс из JDK, вы можете определить свой собственный, например:

public interface NoMethods {
}

Тем не менее, чтобы методы retainAll() и removeAll() давали вам Чтобы получить правильные результаты, вам необходимо реализовать какой-нибудь метод для сравнения экземпляра BaseAdapter с экземпляром EndPoint. Для этого сравнения я предлагаю вам использовать интерфейс Comparable.

Итак, чтобы подвести итог, скелет для класса BaseAdapter может быть:

public class BaseAdapter implements NoMethods, Comparable<NoMethods> {
}

Аналогично для класса EndPoint

public class EndPoint implements NoMethods, Comparable<NoMethods> {
}

Не забудьте реализовать метод equals(Object) в обоих классах.

Наконец, вы должны объявить каждый набор как

Set<NoMethods> set;

Обратите внимание, что Я не проверял вышеизложенное, это всего лишь предположение. Отсюда мое вступительное замечание о том, что на самом деле это не ответ.

0 голосов
/ 13 июля 2020

может вам это поможет:

import java.util.*;

public class Person implements Comparable<Person>{
 private int id;
 private String name;

@Override
public int compareTo(Person p){
  return name.compareTo(p.getName());
}

public void setName(String newName){
  name = newName;
}

public void setId(int newId){
  id = newId;
}

public String getName(){
 return name;
}

public String toString(){
 return "Id: " + id + "\nName: " + name + "\n";
}
}

и

import java.util.*;

public class Main{

 public static void main(String arg[]){
  Set<Person> group1 = new TreeSet<Person>();
  
  Person p1 = new Person();
  p1.setId(1);
  p1.setName("Jonh");
  
  Person p2 = new Person();
  p2.setId(2);
  p2.setName("Frank");
  
  group1.add(p1);
  group1.add(p2);
  
  Set<Person> group2 = new TreeSet<Person>();
  
  Person p3 = new Person();
  p3.setId(1);
  p3.setName("Kathy");
  
  Person p4 = new Person();
  p4.setId(2);
  p4.setName("Jonh");
  
  group2.add(p3);
  group2.add(p4);

  //intersection of the sets
  group1.retainAll(group2);
  
  group1.forEach(e -> System.out.println(e));
 }
}   
...