亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

刪除列表 Java 中的重復對象

刪除列表 Java 中的重復對象

九州編程 2021-11-11 14:21:05
我有課:class MyClass {    String s1;    String s2;}列表對象包括[{s1: "a", s2: "b"}, {s1: "a", s2: "c"}, {s1: "a", s2: "b"}, {s1: "a", s2:“d”}]我想刪除對象重復的 2 個屬性 s1 和 s2預期結果:[{s1: "a", s2: "b"}, {s1: "a", s2: "c"}, {s1: "a", s2: "d"}]如果能用Java 8更好幫我 :(
查看完整描述

3 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

首先像這樣覆蓋equals和hashCode方法MyClass,


@Override

public int hashCode() {

    return 31 * s1.hashCode() + s2.hashCode();

}


@Override

public boolean equals(Object obj) {

    return obj instanceof MyClass && ((MyClass) obj).getS1().equals(getS1())

            && ((MyClass) obj).getS2().equals(getS2());

}

那么消除重復的最簡單方法是使用Set.


new HashSet<>(instances)


查看完整回答
反對 回復 2021-11-11
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

實現 hashcode() 或 equals() 不是必須的。這是一種方法:


Map<List<String>, MyClass> map = new HashMap<>();

List<MyClass> distinctList = myCollection.stream()

    .collect(Collectors.toMap(c -> Arrays.asList(c.s1, c.s2), Function.identity(), (x,y)->x))

    .values()

    .stream()

    .collect(Collectors.toList());


查看完整回答
反對 回復 2021-11-11
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

您需要覆蓋equal和hash code函數,然后使用java 8的Streaming API的distinct函數。


import java.util.ArrayList;

import java.util.List;

import java.util.Objects;

import java.util.stream.Collectors;


public class MyClass {


  private String s1;

  private String s2;


  public MyClass() {

  }


  public MyClass(String s1, String s2) {

    this.s1 = s1;

    this.s2 = s2;

  }


  public String getS1() {

    return s1;

  }


  public MyClass setS1(String s1) {

    this.s1 = s1;

    return this;

  }


  public String getS2() {

    return s2;

  }


  public MyClass setS2(String s2) {

    this.s2 = s2;

    return this;

  }


  @Override

  public boolean equals(Object o) {

    if (this == o) {

      return true;

    }

    if (o == null || getClass() != o.getClass()) {

      return false;

    }

    MyClass myClass = (MyClass) o;

    return Objects.equals(getS1(), myClass.getS1()) &&

        Objects.equals(getS2(), myClass.getS2());

  }


  @Override

  public int hashCode() {

    return Objects.hash(getS1(), getS2());

  }


  @Override

  public String toString() {

    return "MyClass{" + "s1='" + s1 + '\'' + ", s2='" + s2 + '\'' + '}';

  }


  public static void main(String[] args) {

    List<MyClass> list = new ArrayList<>();

    list.add(new MyClass("a", "b"));

    list.add(new MyClass("a", "c"));

    list.add(new MyClass("a", "b"));

    list.add(new MyClass("a", "d"));

    System.out.println("Original size is : " + list.size()); // Size is 4

    list.forEach(System.out::println);

    //Now remove duplicate

    List<MyClass> expected = list.stream().distinct().collect(Collectors.toList());

    System.out.println(

        "After remove duplication size is : " + expected.size()); // Here is your expected result size is 3

    expected.forEach(System.out::println);

  }

}

這是輸出:


原尺寸為:4


我的類{s1='a', s2='b'}


我的類{s1='a', s2='c'}


我的類{s1='a', s2='b'}


我的類{s1='a', s2='d'}


刪除重復后大小為:3


我的類{s1='a', s2='b'}


我的類{s1='a', s2='c'}


我的類{s1='a', s2='d'}


查看完整回答
反對 回復 2021-11-11
  • 3 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號