2011-10-16 7 views
0

내가 같은 일에서만 데이터를 비교하기 위해 노력하고있어이다수의 2 차원 배열에서 하나 개의 요소를 비교하여 (자바)

Array 1 
[0] = ["01/01/01","Bill","17","0.86"] 
[1] = ["02/01/01","Bill","12","0.84"] 
[2] = ["03/01/01","Bill","15","0.85"] 
Array 2 
[0] = ["01/01/01","Joe","14","0.81"] 
[1] = ["02/01/01","Joe","15","0.83"] 
[2] = ["04/01/01","Joe","19","0.85"] 

처럼 조금 밖으로 누워있다 문자열, 여러 차원 배열을 가지고 그래서 뭐 한 배열에 있지만 다른 배열에없는 배열을 검색하여 제거해야합니다. 위의 예에서 두 배열에서 [2]를 제거합니다. List/Collection retainAll을 사용하여이 작업을 수행하는 방법이 있습니까? 아니면 루프를 작성해야합니까? 오, 자바를 사용하고 있습니다.

답변

0

컬렉션을 사용하여 항목을 제거하는 직접적인 방법은 없습니다. 그러나 두 배열이 모두 날짜순으로 정렬 된 경우 각 배열에서 누락 날짜를 제거하지 않고도 데이터를 비교할 수 있습니다.

0

글쎄,이 문제에 대해 배열을 사용하는 것을 선호하지 않습니다. 배열에서 요소를 제거하는 것은 나쁜 생각입니다. 링크드리스트를 시도해보십시오. 이

for (int i=0; i < array1List.size(); i++) { 
    String date = array1List.get(i)[0]; 
    int index = -1; 
    for(int j=0; j < array2List.size(); j++) { 
     if array2List.get(j)[0].equals(date)) { 
      index = j; 
      break; 
     } 

     if(index >= 0) array2List.remove(j); 
    } 
} 
+0

@Pat에 버그가 있습니다. 'array2List'에서 제거 할 경우'j ++'는 항목을 건너 뜁니다. 나는 당신의'if (index> = 0)'테스트가'else j ++'를 가져야하고'for' 루프에서 증가분을 제거해야한다고 생각합니다. – Gray

0

같은 것을 사용하면 객체에 각 배열의 항목을 넣어해야합니다이 작업을 수행하기 위해 Collection를 사용하십시오. 당신이 DateInfo 컬렉션으로 배열 모두를로드하는 경우 다음

class DayInfo { 
    String date; 
    String name; 
    ... 
    public DayInfo(String[] arrayData) { 
     this.date = arrayData[0]; 
     this.name = arrayData[1]; 
     ... 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (!(obj instanceof DayInfo)) 
      return false; 
     if (date == null) { 
      return ((DayInfo)obj).date == null; 
     } else { 
      return date.equals((DayInfo)obj).date); 
     } 
    } 
    @Override 
    public int hashCode() { 
     if (date == null) 
      return 0; 
     else 
      return date.hashCode(); 
    } 
} 

: 뭔가처럼 지금

Set<DayInfo> dayInfos1 = new HashSet<DayInfo>(array1.length); 
for (String[] arrayEntry : array1) 
    dayInfos1.add(new DayInfo(arrayEntry)); 
Set<DayInfo> dayInfos2 = new HashSet<DayInfo>(array2.length); 
for (String[] arrayEntry : array2) 
    dayInfos2.add(new DayInfo(arrayEntry)); 

당신은 두 방향에서 retainAll를 사용할 수 있습니다

// remove everything from set #1 that doesn't have a date in set #2 
dayInfos1.retainAll(dayInfos2); 
// remove everything from set #2 that doesn't have a date in set #1 
dayInfos2.retainAll(dayInfos1); 

을 나는 그 것 같아요 작업.

관련 문제