【问题标题】:Compare two array lists of objects by property value按属性值比较两个对象数组列表
【发布时间】:2020-12-03 15:11:14
【问题描述】:

我有两个对象数组列表,我需要通过属性值比较它们并返回唯一的。对象有两个属性,question 和 answer,只应返回列表一中具有唯一问题的对象。

        *faq(question, answer)*

        List<faq> one = new ArrayList<>();
        one.add(new faq("question 1", "answer 1"));
        one.add(new faq("question 2", "answer 2"));
        one.add(new faq("question 3", "answer 3"));
        
        List<faq> two = new ArrayList<>();
        two.add(new faq("question 4", "answer 4"));
        two.add(new faq("question 5", "answer 5"));
        two.add(new faq("question 1", "answer 6"));
        two.add(new faq("question 7", "answer 7"));
        two.add(new faq("question 8", "answer 8"));

从这里的代码中,我想从列表一中获取带有问题 2 和 3 的对象,因为只有这两个不包含在列表二中

【问题讨论】:

  • faq 是否实现/覆盖equals(和哈希码)方法?
  • 您在寻找List#removeAll 方法吗? javadocs如果你想离开列表one而不做任何更改,只需先复制它。

标签: java object arraylist


【解决方案1】:

你需要在Faq.java中实现equals()hashCode()

  • Faq.java
    import java.util.Objects;
    import java.util.StringJoiner;
    
    public class Faq {
        private String questions;
        private String answer;
    
        public Faq(final String questions, final String answer) {
            this.questions = questions;
            this.answer = answer;
        }
    
    
        @Override
        public boolean equals(final Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            final Faq faq = (Faq) o;
            return questions.equals(faq.questions);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(questions);
        }
    
        @Override
        public String toString() {
            return new StringJoiner(", ", Faq.class.getSimpleName() + "[", "]")
                    .add("questions='" + questions + "'")
                    .toString();
        }
    }
  • Main.java
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Faq> one = new ArrayList<>();
        one.add(new Faq("question 1", "answer 1"));
        one.add(new Faq("question 2", "answer 2"));
        one.add(new Faq("question 3", "answer 3"));

        List<Faq> two = new ArrayList<>();
        two.add(new Faq("question 4", "answer 4"));
        two.add(new Faq("question 5", "answer 5"));
        two.add(new Faq("question 1", "answer 6"));
        two.add(new Faq("question 7", "answer 7"));
        two.add(new Faq("question 8", "answer 8"));

        one.removeAll(two);
        System.out.println(one);
    }
}
  • 输出
    [Faq[questions='question 2'], Faq[questions='question 3']]

【讨论】:

  • 值得注意的是它修改了列表one。如果 OP 想保持 one 原样,他应该先复制它。
猜你喜欢
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多