Проблема с добавлением отсортированных числовых строк в SortedSet в Java - PullRequest
1 голос
/ 01 июня 2011

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

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
    theSize++;
    AnyType[] newItems = (AnyType[]) new Comparable[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; //*/
    }
}

И я проверяю отсортированные строки чисел, как это:

public static void main(String[] a) {


    SortedSet<String> s1 = new SortedSet<String>();
    final int NUM1 = 37;
    final int NUM2 = 53;
    final int NUM3 = 61;

    for (int i = NUM1; i != 0; i = (i + NUM1) % NUM3) {
        s1.add("" + i);
    }
    s1.show();
    for (int i = NUM1; i != 0; i = (i + NUM1) % NUM3) {
        s1.add("" + i);
    }
    s1.show();
    for (int i = NUM1; i != 0; i = (i + NUM1) % NUM2) {
        s1.remove("" + i);
    }

    s1.show();

    }

И на выходе я получаю:

1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 26 27 28 29 3 30 31 32 33 34 35 36 37 3839 4 40 41 42 43 44 45 46 47 48 49 5 50 51 52 53 54 55 56 57 58 59 6 60 7 8 9

Мой вопрос: как мне сделать так, чтобы это было отсортированотак должно быть??Я знаю, что проблема в методе добавления (он также должен иметь возможность сортировать строки и целые числа)

И он прекрасно работает, когда я создаю SortedSet из Strings или Integer, когда я их смешиваю следующим образомЯ получаю этот "несортированный" результат.

Помогите ??Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Это похоже на отсортированные строки для меня.«1» предшествует «10», точно так же, как «a» предшествует «ab» в словаре.@MRAB предлагает правильное предложение для преобразования ваших строк, представляющих числа, в действительные числа, если вы хотите, чтобы они сортировались в числовом порядке.

Вы можете сделать это с помощью Comparator, если вы хотите сохранить свой набор SortedSet<String> (ошибкапроверка не выполняется в приведенном ниже фрагменте):

    SortedSet<String> s1 = new TreeSet<String>(new Comparator<String>() {
        /**
         * Returns a positive value if number1 is larger than number 2, a
         * negative number if number1 is less than number2, and 0 if they
         * are equal.
         */
        public int compare(String number1, String number2) {
            return Integer.parseInt(number1) - Integer.parseInt(number2);
        }
    });
1 голос
/ 01 июня 2011

Преобразование числовых строк в числа перед их сравнением.

В качестве альтернативы, при сравнении двух числовых строк разной длины добавьте более короткую строку такой же длины, как и более длинную, добавив нули в начало.. * * 1003

...