Как отсортировать массив, полный нулевых значений, без использования Comparator? - PullRequest
0 голосов
/ 14 февраля 2020

это мой первый пост. Как вы можете догадаться, это вопрос, связанный с домашней работой, но у меня возникли некоторые проблемы с этой топикой c, потому что другие не могли использовать компараторы для сравнения нулевых объектов друг с другом, я не могу. Вот мой код:

Здесь строка объявлена ​​и расположена

public class OrderedStringArrayList {

    private String[] array;


    @SuppressWarnings("unchecked")

    public OrderedStringArrayList() {
        array = new String[10];

    }

Это фактическая сортировка

 public int insert(String item) {
        boolean arrIsOpen = false;
        //------------------------Insert Sort Vars---------------------------
        int parseOne = 0;
        int parseTwo = 0;
        int reaLen = array.length;
        String check = "";
        //-------------------------------------------------------------------

        for (int i = 0; i < array.length; i++) {
            /*---------------------------------------------Check for Open slot-----------------------------------------------*/
            if (array[i] == null) {
                arrIsOpen = true;
            }
            if (arrIsOpen == true) {
                array[i] = item;
                break;
            }
        }
            /*--------------------------------------------------------------------------------------------*/
        if (arrIsOpen == true) { //Insert Sort here

            for (parseOne = 1; parseOne < (reaLen); parseOne++) {
                check = array[parseOne];

                parseTwo = parseOne - 1;
                while (parseTwo >= 0 && ((check.compareTo(array[parseTwo]) < 0))) {
                    array[parseTwo + 1] = array[parseTwo];
                    parseTwo--;
                }
                array[parseTwo + 1] = check;
            }
        }
        else {                  // Grow the array by factor of 2 and copy over elements
            String[] backingArray = new String[2 * array.length];
            for (int i = 0; i < array.length; i++) {
                backingArray[i] = array[i];
            }
            /*----------------------------------------------------------------------Sort--------------------*/
            reaLen = backingArray.length;
            for (parseOne = 1; parseOne < (reaLen); parseOne++) {
                check = array[parseOne];


                parseTwo = parseOne - 1;
                while (parseTwo >= 0 && (check.compareTo(array[parseTwo]) < 0)) {

                    array[parseTwo + 1] = array[parseTwo];
                    parseTwo--;
                }
                array[parseTwo + 1] = check;
            }
        }
        return 0;
    }

и вот тест


    @Test
    public void insertOneItem() {
        OrderedStringArrayList a = new OrderedStringArrayList();
        assertEquals("Size should be 0 after construction!", 0, a.size());
        a.insert("Hello!");
        assertEquals("Size should be 1 after one insert!", 1, a.size());
    }

Моя ошибка возникает во втором блоке кода в этой строке:

while (parseTwo >= 0 && (check.compareTo(array[parseTwo]) < 0)) {

Я получаю исключение NullPointerException, поскольку check == null и его попытка сравнить. Дело в том, что я не могу использовать компараторы для сортировки. Моя конечная цель - поместить элемент в этот массив, увеличить его на 2, если места нет. Чтобы проверить, есть ли место, в моем строковом массиве должно быть пустое (нулевое) место, но я не могу ничего сравнить с пустым местом, поэтому не могу отсортировать массив. Это беспокоило меня в течение нескольких дней, пожалуйста, помогите.

РЕДАКТИРОВАТЬ: Вот Stacktrace / Ошибка

java.lang.NullPointerException
    at OrderedStringArrayList.insert(OrderedStringArrayList.java:57)
    at OrderedStringArrayListTests.insertOneItem(OrderedStringArrayListTests.java:15)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

1 Ответ

0 голосов
/ 14 февраля 2020

Если ваш счетчик содержимого массива равен 1, он уже отсортирован, это особый случай, когда вы не go применяете механизм сортировки

public class OrderedStringArrayList {

   private String[] array;
   private int arrayContentCount = 0;

   @SuppressWarnings("unchecked")

    public OrderedStringArrayList() {
       array = new String[10];

    }
}

public int insert(String item) {

   if(arrayContentCount == 0) { <--- this
         //insert the item and be done with it.
     array[0] = item;
     arrayContentCount++;
     return;
   }
    boolean arrIsOpen = false;
    //------------------------Insert Sort Vars---------------------------
    int parseOne = 0;
    int parseTwo = 0;
    int reaLen = array.length;
    String check = "";
    //-------------------------------------------------------------------

    for (int i = 0; i < array.length; i++) {
        /*---------------------------------------------Check for Open slot-----------------------------------------------*/
        if (array[i] == null) {
            arrIsOpen = true;
        }
        if (arrIsOpen == true) {
            array[i] = item;
            break;
        }
    }
        /*--------------------------------------------------------------------------------------------*/
    if (arrIsOpen == true) { //Insert Sort here

        for (parseOne = 1; parseOne < (reaLen); parseOne++) {
            check = array[parseOne];
            if (check == null) {
                check = "0";
            }

            parseTwo = parseOne - 1;
            while (parseTwo >= 0 && ((check.compareTo(array[parseTwo]) < 0))) {
                array[parseTwo + 1] = array[parseTwo];
                parseTwo--;
            }
            array[parseTwo + 1] = check;
        }
    }
    else {                  // Grow the array by factor of 2 and copy over elements
        String[] backingArray = new String[2 * array.length];
        for (int i = 0; i < array.length; i++) {
            backingArray[i] = array[i];
        }
        /*----------------------------------------------------------------------Sort--------------------*/
        reaLen = backingArray.length;
        for (parseOne = 1; parseOne < (reaLen); parseOne++) {
            check = array[parseOne];


            parseTwo = parseOne - 1;
            while (parseTwo >= 0 && (check.compareTo(array[parseTwo]) < 0)) {

                array[parseTwo + 1] = array[parseTwo];
                parseTwo--;
            }
            array[parseTwo + 1] = check;
        }
    }

    //assuming that the item was inserted by now
    //arrayContentCount++;
    return 0;
}
...