Проблема с добавлением элемента в массив в упорядоченном наборе

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

Вот мой код:

public boolean add(AnyType x){
    if(this.contains(x))
        return false;
    else if(this.isEmpty()){
        items[theSize]=x;
        theSize++;
        return true;
    }
    else{
    if( theSize == items.length )
        this.grow();
    //Here goes code for adding
    /*AnyType[] newItems = (AnyType[]) new Comparable[items.length];
    newItems = items;
    for(int i=0;i<theSize;i++)
        if(items[i].compareTo(x)>0){
            newItems[i]=x;
            newItems[i+1]=items[i];
            for(int j=i+1;j<theSize;j++)
                newItems[j]=items[i];
            items = newItems;
            theSize++;
            return true;
        }

    //*/
    items[theSize]=x; //*/
    theSize++;
    return true;
    }
}

Метод не должен позволять элементу повторяться, поэтому, если вы попытаетесь добавить что-то, что уже есть, он должен вернуть false. Если массив пуст, просто добавьте к items[0], а затем я попытался создать новый массив, и как только вы найдете элемент, размер которого больше, чем тот, который я ввожу, скопируйте все в новый массив, добавьте новое значение и просто добавьте остальные, а затем сделать items = newItems; но это не сработало. Я пытался пару часов, поэтому я просто решил обратиться за помощью. У меня есть класс SortedSet, определенный следующим образом:

public class SortedSet<AnyType extends Comparable> implements Set<AnyType>
{
    private AnyType[] items;
    private int theSize;
    public SortedSet(){
        theSize = 0;
        items = (AnyType[]) new Comparable[5];
    }

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

Спасибо

3 ответа

Решение

Я не вижу, где вы пишете предыдущие значения?

Попробуйте что-то подобное в последнем случае.

            theSize++;
            AnyType[] newItems = new AnyType[theSize];
            for(int i = 0; i < theSize-1; i++)
                if(items[i].compareTo(x) > 0)
                {
                    newItems[i] = x;
                    newItems[i + 1] = items[i];
                    for(int j = i + 2; j < theSize; j++)
                        newItems[j] = items[j-1];
                    items = newItems;
                    return true;
                }
                else
                    newItems[i] = items[i];
            newItems[theSize-1] = x;
            items = newItems;
            return true;

Поскольку я уже кодировал его, чтобы убедиться, что он работает нормально, вот пример работы со строками. Я сосредоточился здесь только на правильном добавлении. Другие вопросы, важные для ФП, были опущены.

import java.util.Arrays;

public class OrderingAddTest
{
    static int theSize = 0;
    static String[] items = new String[theSize];
    public static void main(String[] args)
    {
        add("a");
        add("e");
        add("d");
        add("b");
        add("c");

        System.out.println(Arrays.toString(items)+"\n; items.length="+items.length);
    }

    private static boolean add(String x)
    {
        theSize++;
        String[] newItems = new String[theSize];
        for(int i = 0; i < theSize - 1; i++)
            if(items[i].compareTo(x) > 0)
            {
                newItems[i] = x;
                newItems[i + 1] = items[i];
                for(int j = i + 2; j < theSize; j++)
                    newItems[j] = items[j - 1];
                items = newItems;
                return true;
            }
            else
                newItems[i] = items[i];
        newItems[theSize - 1] = x;
        items = newItems;
        return true;
    }
}

Уже есть нативный класс Java, который имеет эти функции: java.util.TreeSet.

В множестве один и тот же элемент не может появляться дважды. Метод "add" возвращает логическое значение: true, если элемент был добавлен, и false, если он уже был в наборе.

TreeSet - это реализация "SortedSet", которая поддерживает порядок элементов. Ваши предметы должны только реализовать "Сопоставимые".

Ваши вещи имеют тот же размер, что и предметы, они должны быть размером +1

Я думаю, у вас есть проблема здесь

для (int j=i+ 1; j

newItems[J]= пункты [I];

здесь j точно увеличивается, но для i операции увеличения не дается, поэтому всем новым элементам в этом цикле присваивается одно и то же значение


РЕДАКТИРОВАТЬ:

    int i;

    for(i=0; i < theSize+1 ; i++)
    if(items[i].compareTo(x)>0){
    newItems[i]=x;

    for(;i<theSize + 1; i++)
     newItems[i]=items[i-1];

: делай что дальше.

РЕДАКТИРОВАТЬ 2:

Вы делаете неправильные вещи здесь,

items = newItems;

и предыдущий оператор присваивания (newItems=items)

Вы не можете приравнять их, поскольку они не одинакового размера, вы можете сделать это, если вы используете указатель (использование указателей здесь значительно облегчит эту задачу)

Другие вопросы по тегам