Использование класса Objects и его свойств в коллекциях Java - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть класс Class1 с 3 свойствами (prop1, prop2, prop3).У меня есть другой класс Class2 с hashMap1 Hashmap.Я использую объект Class1 в hashMap1 и вставляю значение для prop1, prop2, prop3.

Class1

public class Class1
{
    private String Prop1;
    private String Prop2;
    private int Prop3;

    public Class1(String Prop1, String Prop2, int Prop3)
    {
        this.Prop1= Prop1;
        this.Prop2= Prop2;
        this.Prop3= Prop3;
    }
}

Class2

public class Class2
{

    public static void main(String[] args)
    {
        HashMap<String, Class1> hashMap1= new LinkedHashMap<>(); 

        hashMap1.put("01" , new Class1("Prop1a","Prop2a", 101));
        hashMap1.put("02" , new Class1("Prop1a","Prop2b", 202));
        hashMap1.put("03" , new Class1("Prop1b","Prop2a", 303));    
    }
}

Я пытаюсь выяснить, как я могу распечатать все списки из коллекций, где Prop1 = "Prop1a" ИЛИ Prop2 = "Prop2a"?Я надеюсь, что это имеет смысл.

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

Ответы [ 4 ]

0 голосов
/ 24 февраля 2019

Вы захотите перебрать значения вашей карты, выбрать те, которые соответствуют вашим критериям, и распечатать их.Один из способов сделать это с помощью потока:

hashMap1.entrySet()
        .stream()
        .filter(c1 -> c1.getProp1().equals("Prop1a") || c1.getProp2.equals("Prop2a"))
        .forEach(c1 -> System.out.println(c1));

Вам нужно будет реализовать базовые методы получения и toString() для Class1.

0 голосов
/ 24 февраля 2019

Если вы хотите получить список Class1 с определенными свойствами, это также можно сделать с помощью stream api:

Predicate<Class1> prop1Predicate = class1 -> class1.getProp1().equals("Prop1a");
Predicate<Class1> prop2Predicate = class1 -> class1.getProp2().equals("Prop2a");

List<Class1> list = hashMap1.values().stream()
        .filter(prop1Predicate.or(prop2Predicate))
        .collect(Collectors.toList());  // or .forEach(System.out::println); to print (without return value)
0 голосов
/ 24 февраля 2019

Вам необходимо создать геттеры в Class1 и в идеале также переопределить метод toString () для печати Class1 по вашему желанию.Затем вы можете сделать что-то вроде этого:

 for (Map.Entry<String, Class1> entry : hashMap1.entrySet()) {
        Class1 value = entry.getValue();
        if (value.getProp1().equals("Prop1a") || value.getProp2().equals("Prop2a")) {
             System.out.println(value);
        }
 }

Я не тестировал код, дайте мне знать в комментариях, если он не работает.

0 голосов
/ 24 февраля 2019

Старая школа (простая, работает со всеми версиями Java) использует цикл.

public static void main(String[] args)
{
  HashMap<String, Class1> hashMap1= new LinkedHashMap<String, Class1>(); 

    hashMap1.put("01" , new Class1("Prop1a","Prop2a", 101));
    hashMap1.put("02" , new Class1("Prop1a","Prop2b", 202));
    hashMap1.put("03" , new Class1("Prop1b","Prop2a", 303));

    for( Class1 c : hashMap1.values() ) {
       if( c.getProp1().equals( "Prop1a" ) || c.getProp2().equals( "Prop2a" ) )
          System.out.println( c );
    }
}

Обратите внимание, что вам, конечно, нужны геттеры в Class1, а переопределенный toString полезен.

class Class1
{
    private String Prop1;
    private String Prop2;
    private int Prop3;

   public String getProp1() {
      return Prop1;
   }

   public String getProp2() {
      return Prop2;
   }

   public int getProp3() {
      return Prop3;
   }

    public Class1(String Prop1, String Prop2, int Prop3)
    {
        this.Prop1= Prop1;
        this.Prop2= Prop2;
        this.Prop3= Prop3;
    }

   @Override
   public String toString() {
      return "Class1{" + "Prop1=" + Prop1 + ", Prop2=" + Prop2 + ", Prop3=" + Prop3 + '}';
   }
}
...