Сравните один элемент из нескольких 2D-массивов (Java) - PullRequest
0 голосов
/ 16 октября 2011

У меня есть несколько 2D-массивов строк, которые расположены примерно так

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 или мне придется написать цикл?О, я использую Java.

Ответы [ 3 ]

0 голосов
/ 16 октября 2011

Ну, я не предпочитаю использовать массивы для этой проблемы. Удаление элементов из массива - плохая идея. Вы можете попробовать связанный список. Как то так

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 голосов
/ 17 октября 2011

Чтобы использовать 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);

Думаю, это сработает.

0 голосов
/ 16 октября 2011

Нет прямого способа удаления предметов с помощью коллекции. Но если оба массива отсортированы по дате, вы сможете сравнить данные, не удаляя пропущенные даты из каждого массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...