2014-12-16 3 views
0

좋아요, 그래서이 주제가 여러 번 요청되었습니다. 모두 일반적으로 어떤 종류의 세트를 사용하는 것을 말합니다.객체의 요소를 기반으로 배열 목록에서 중복을 제거합니다.

이제 여기에 문제가 있습니다.

많은 Rate (object)가있는 RateSheet (ArrayList)가 있습니다. 이 속도 객체에서 우리는 변수가 있습니다

desName 이 요약 이제

비용 접두사를,이 RateSheet을 가지고 desName에 따라 모든 중복 비율을 제거 할.

나는 세트와 컬렉션을 사용하여이를 수행했습니다. 어느 쪽이 효과가 있긴하지만, 캐스팅 오류가 발생하면 개별 객체에 액세스 한 다음 변수 등을 액세스 할 수 없습니다. 그래서 저는 세트를 사용하지 않고 이것을 시도하고 있습니다.

+4

일부 코드를 공유하십시오. 지금까지 무엇을 가지고 있었으며 정확하게 어떤 오류가 있습니까? – Mureinik

+2

새 배열 목록을 만들고 요소를 새 배열에 삽입하기 시작합니다. 해당 요소가 이미 배열에 존재하면 두 번째로 삽입하지 마십시오. –

+0

달성하려는 내용을 나타내는 컨텍스트와 코드를 더 제공하지 않으면 "사용자가 묻는 것이 분명하지 않습니다"아래에서 닫힙니다. – mkobit

답변

1

요율표에서 세트를 만들고 각 요율표의 desName 세트에 삽입한다고 가정합니다.

불행하게도 Set API는 equals 메서드와 hashCode 메서드를 기반으로하므로 desName 특성을 기반으로 equals 및 hashCode를 implements하면 desName과 관련된 고유 한 요율표 개체가 포함됩니다 접두사와 관련해서는 고유해야하므로 equals 메서드와 hashCode 메서드를 변경해야합니다.

저는 과거에 desName 또는 접두어에 링크 된 요율표 안의 어댑터를 연결함으로써 과거와 같이 해왔습니다. 따라서 hashCode가 현재 어댑터에서 제공하는 "hashCode"로 리디렉션됩니다.

1
Set<String> s = new HashSet(); 
    for(int i=0;i<RateSheet.size;i++){ 
    Rate rate = (Rate)RateSheet.get(i); 
    s.add(rate.desName); 
    } 

Set<Rate> rs = new HashSet(); 

    for(int i=0;i<RateSheet.size;i++){ 
    Rate rate = (Rate) RateSheet.get(i); 
    Iterator it = s.iterator(); 
    while(it.hasNext()){ 
     if(rate.desName.equals(it.next()){ 
      rs.add(rate); 
     } 
    } 
} 
0

다음은 Set으로 수행하는 방법에 대한 코드 예입니다. 당신은 그들이 중복 무엇을 찾기 위해 후드를 사용하지 무엇 때문에 해시 코드()와 같음()를 오버라이드 (override) 할 필요가 :

import java.util.HashSet; 

public class RateSheet 
{ 
    private String desName; 

    public RateSheet(String name) 
    { 
     desName = name; 
    } 

    @Override 
    public boolean equals(Object other) 
    { 
     if (other == null) return false; 
     if (other == this) return true; 
     if (!(other instanceof RateSheet))return false; 
     RateSheet otherAsRateSheet = (RateSheet)other; 

     return desName.equals(otherAsRateSheet.desName); 
    } 

    @Override 
    public int hashCode() 
    { 
     return desName.hashCode(); 
    } 

    public static void main(String[] args) 
    { 
     HashSet<RateSheet> sheets= new HashSet<RateSheet>(); 

     RateSheet a = new RateSheet("a"); 
     RateSheet b = new RateSheet("a"); 
     RateSheet c = new RateSheet("b"); 

     System.out.println(sheets.add(a)); 
     System.out.println(sheets.add(b)); 
     System.out.println(sheets.add(c)); 
    } 
} 

이이 다른 대답을 기반으로 여기에서 찾을 : Java Set collection - override equals method 도를 이 중 하나 : Why is equals() not called while adding to HashSet and hashCode matches? 및 @ GerritCap 게시했습니다. (미안 해요 조금 느립니다)

0
List<RateSheets> dedupSheets(List<RateSheet> sheets) { 
    Map<String,RateSheet> map = new HashMap<>(); 
    for(Rate r: sheets) map.put(r.getName(), r); 
    return new ArrayList<>(rateSheets.values()); 
} 
관련 문제