Код для поиска похожих объектов в нескольких двумерных массивах - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь написать код для проблемы, описанной в моей предыдущей теме . Предложенное решение состояло в том, чтобы использовать хеш-карты для поиска похожих записей в нескольких массивах (массивы имеют одинаковое количество столбцов, но могут иметь разное количество строк).

Ниже приведен мой пример кода, основанный на фрагменте кода пользователя Джона Б. здесь . Для простоты и в целях отладки я создал только 3 разных одномерных строки вместо двумерных массивов. Также для простоты функция equalRows должна возвращать true или false вместо индексов строк.

Итак, в приведенном ниже коде функция equalRows должна возвращать false, потому что array3 имеет {1,3,4} и {1,2,3}. Вместо этого функция возвращает true. Почему это происходит?

import java.util.HashMap;
import java.util.Map;

public class Test {

    public static void main(String[] args) {
        int[] array1 = {1,2,3}; 
        int[] array2 = {1,2,3}; 
        int[] array3 = {1,3,4};
        boolean answ = equalRows(array1,array2,array3);
        System.out.println(answ);
    }

    static class Row extends Object {
        private int value;
        private volatile int hashCode = 0;

        public Row(int val) {
            this.value = val;
        }

        @Override
        public boolean equals(Object obj) {
            if(this == obj)
                return true;
            if((obj == null) || (obj.getClass() != this.getClass()))
                return false;
            // object must be Row at this point
            Row row = (Row)obj;
                return (value == row.value);
        }

        @Override
        public int hashCode () {
            final int multiplier = 7;
            if (hashCode == 0) {
                int code = 31;
                code = multiplier * code + value;
                hashCode = code;
            }
            return hashCode;
        }
    }

    private static Map<Row, Integer> map(int[] array) {
          Map<Row, Integer> arrayMap = new HashMap<Row, Integer>();
          for (int i=0; i<array.length; i++)
                arrayMap.put(new Row(array[i]), i);
          return arrayMap;
    }

    private static boolean equalRows(int[] array1, int[] array2, int[] array3){
           Map<Row, Integer> map1 = map(array1);
           Map<Row, Integer> map2 = map(array2);

           for (int i=0; i<array3.length; i++){
              Row row = new Row(array3[i]);
              Integer array1Row = map1.get(row);
              Integer array2Row = map2.get(row);
              if (array1Row != null || array2Row != null) {
                  return false;
              }
           }
        return true;
    }

}

Изменить # 1 Код обновляется в соответствии с предлагаемым решением.

Редактировать # 2 Я проверил предложенное решение, но функция возвращает false даже для: int [] array1 = {1,2,3}; int [] array2 = {1,2,3}; int [] array3 = {1,2,3}, хотя это должно быть правдой. Я думаю, что проблема с функцией hashcode. Итак, какое-нибудь решение?

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Эта строка неверна, она сразу возвращает true:

if (array1Row != null && array2Row != null) {
    return true;
}

Что вы должны сделать, это (полностью перевернуть логику):

if (array1Row == null || array2Row == null) {
    return false;
}
1 голос
/ 09 января 2012

Это только проверка первого элемента в каждом массиве и возвращение true, потому что они совпадают.

Вам необходимо вернуть false, если какие-либо ошибки не совпадают, а затем вернуть true, если ошибок нет.

Я бы также поставил тест длины в начале метода equalRows.

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