Я сравниваю элементы в двух массивах и печатаю эти элементы, а также количество сравнений.

В методе findCommonElements у меня не может быть пустых массивов, иначе я получаю ошибку NullPointerException (конечно).

Я не могу просто объявить их или получаю ошибку «переменная, возможно, не была инициализирована».

Мне нужно использовать несколько версий этих массивов для тестирования, но я не знаю, как это сделать. Программа читает только первые экземпляры массивов.

Код:

import java.util.*;

public class CommonElements {

private static int comparisons = 0;

public static void main(String[] args) {

    new CommonElements().firstTest();
    //new CommonElements().secondTest();
    //new CommonElements().thirdTest();
}
public void setComparisons(int comparisons) {
    this.comparisons = comparisons;
}
public int getComparisons() {
    return comparisons;
}
public static Comparable[] findCommonElements(Comparable[][] collections) {

    Comparable[] arr1 = {'A', 'B', 'C', 'D'};
    Comparable[] arr2 = {'C', 'D', 'E', 'F', 'G'};
    Comparable[] hashArray;
    Comparable[] searchArray;
    if(arr1.length < arr2.length) {
        hashArray = arr1;
        searchArray = arr2;
    }
    else {
        hashArray = arr2;
        searchArray = arr1;
    }
    HashSet<Comparable> intersection = new HashSet<>();
    HashSet<Comparable> hashedArray = new HashSet<>();
    for(Comparable element : hashArray) {
        hashedArray.add(element);
    }
    for(Comparable element : searchArray) {
        if(hashedArray.contains(element)) {
            intersection.add(element);
            comparisons++;
        }
    }
    return intersection.toArray(new Comparable[0]);
}
public void firstTest() {
    Comparable[] array1 = {'A', 'B', 'C', 'D', 'E'};
    Comparable[] array2 = {'E', 'F', 'G', 'H'};
    Comparable[][] collections = {array1, array2};
    Comparable[] commonStuff = CommonElements.findCommonElements(collections);
    System.out.println("First Test");
    System.out.println("Comparisons: " + getComparisons());
    System.out.print("Common Elements: ");
    for(Comparable element : commonStuff) {
        System.out.print(element.toString() + " ");
    }
    System.out.println();
}

/*
public void secondTest() {
    Comparable[] array1 = {'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'};
    Comparable[] array2 = {'D', 'E', 'F', 'G', 'H'};
    Comparable[][] collections = {array1, array2};
    Comparable[] commonStuff = findCommonElements(collections);
    System.out.println("Second Test");
    System.out.println("Comparisons: " + getComparisons());
    for(Comparable element : commonStuff) {
        System.out.print(element.toString() + " ");
    }
    System.out.println();
}
public void thirdTest() {
    Comparable[] array1 = {'1', '2', '3', '3'};
    Comparable[] array2 = {'3', '2', '4', '5', '6'};
    Comparable[][] collections = {array1, array2};
    Comparable[] commonStuff = findCommonElements(collections);
    System.out.println("Third Test");
    System.out.println("Comparisons: " + getComparisons());
    for(Comparable element : commonStuff) {
        System.out.print(element.toString() + " ");
    }
    System.out.println();
}
*/
}

Это результат, и он читает массивы в методе findCommonElements, а не в методе firstTest () (другие методы тестирования идентичны, за исключением значений в массивах, поэтому они закомментированы):

    First Test
    Comparisons: 2
    Common Elements: C D

ПРИМЕЧАНИЕ Да, у меня есть неиспользуемый параметр в методе findCommonElements. Это было обязательным требованием, и я не понимал, как включить в него 2D-массив… по крайней мере, пока.

Да, массивы имеют тип Comparable. Это еще одно требование.

Кроме того, приношу свои извинения, если какая-либо моя логика неверна в этом коде. Я пока просто пытаюсь понять эту проблему.

0
IRGeekSauce 21 Фев 2016 в 13:13

3 ответа

Лучший ответ

Вместо того

public static Comparable[] findCommonElements(Comparable[][] collections) {
  Comparable[] arr1 = {'A', 'B', 'C', 'D'};
  Comparable[] arr2 = {'C', 'D', 'E', 'F', 'G'};

Напишите это (при условии, что вы всегда получаете ровно 2 элемента):

public static Comparable[] findCommonElements(Comparable[][] collections) {
  Comparable[] arr1 = collections[0];
  Comparable[] arr2 = collections[1];

Тогда ваши тесты начнут работать.

1
Tassos Bassoukos 21 Фев 2016 в 10:24

Вы можете проверить свой параметр на null, и если какой-либо из них имеет значение null, вы можете вернуть пустой Comparablearray (что является истинным в пустом случае).

  public static Comparable[] findCommonElements(Comparable[][] collections) {
    if((collections[0]==null) || (collections[1]==null)){
    return new Comparable[0];
    }
    Comparable[] arr1 = collections[0];
    Comparable[] arr2 = collections[1];
    Comparable[] hashArray;
    Comparable[] searchArray;
    if(arr1.length < arr2.length) {
    [...]

Кстати. так как у вас есть поле для сравнений. Убедитесь, что вы правильно с этим справляетесь. Установите его в 0 всякий раз, когда вы запускаете новый findCommonElements или что-то еще.

1
Jodn 21 Фев 2016 в 10:31

Чтобы объявить массив, вы должны использовать этот синтаксис:

// Type[] array = new Type[arrayLenght];

Например, если вы хотите создать массив Comparable длиной 10 , вы должны сделать что-то вроде этого:

Comparable[] myArray = new Comparable[10];
1
aleb2000 21 Фев 2016 в 10:22