2011-10-16 185 views
0

我有被奠定了有点像这样从多个二维数组比较一个元素(JAVA)

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]。有没有办法使用列表/集合retainAll或我将不得不写一个循环?哦,我正在使用Java。

回答

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要做到这一点,你将不得不把每个数组进入一个对象。喜欢的东西:

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(); 
    } 
} 

然后,如果你既您的阵列装入DateInfo类别:

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); 

我认为这将工作。