Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2016, 06:18   #1
Fillip
Новичок
Джуниор
 
Регистрация: 05.05.2016
Сообщений: 2
По умолчанию Создание интерфейса сортировки

Здравствуйте, ребята! Подскажите, пожалуйста, как улучшить код...
Программа должна сортировать переданный список записей, строка бьется на подстроки следующим образом: выделяем непрерывные максимальные фрагменты строки, состоящие только из цифр, и считаем набором подстрок эти фрагменты и все оставшиеся от такого разбиения фрагменты строки
при сравнении строк осуществляется последовательное сравнение их подстрок до первого несовпадения, если обе подстроки состоят из цифр - то при сравнении они интерпретируются как целые числа (вначале должно идти меньшее число), в противном случае - как строки.
Ниже приведенный код сортирует по первой колонке(и числа, и, если подставить, строки), но результат выдает некорректный... Как можно исправить?


Код:
package ru.tandemservice.test.task1;
import java.util.List;
public interface IStringRowsListSorter {
     * @param columnIndex индекс колонки, по которой нужно провести сортировку
     */
    void sort(List<String[]> rows, int columnIndex);
}
package tandemservice.test.task1;


Код:
import java.util.*;
public class TaskImpl implements IStringRowsListSoerter {
    public static final IStringRowsListSoerter INSTANCE = new TaskImpl();
    @Override
    public void sort(List<String[]> rows, int columnIndex) {
        rows.sort(new ColumnClass(columnIndex));
            }
}
Код:
package tandemservice.test.task1;
import java.util.Comparator;
public class ColumnClass implements Comparator<String[]> {
    private final int columnIndex;
    private final StringComparator stringComparator = new StringComparator();
    public ColumnClass(int columnIndex) {
     this.columnIndex = columnIndex;
        }
     @Override
       public int compare(String[] s1, String[] s2) {
                if (s1 == null && s2 == null) return 0;
                if (s1 == null) return -1;
                if (s2 == null) return 1;
                if (s1.equals(s2)) return 0;
               int requiredLength = columnIndex + 1;
                if (s1.length < requiredLength && s2.length < requiredLength) return 0;
                if (s1.length < requiredLength) return -1;
                if (s2.length < requiredLength) return 1;

               return stringComparator.compare(s1[columnIndex], s2[columnIndex]);
            }
}
Код:
package tandemservice.test.task1;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        if (s1 == null && s2 == null) return 0;
                if (s1 == null) return -1;
                if (s2 == null) return 1;
                if (s1.equals(s2)) return 0;
                if (s1.length() == 0) return -1;
                if (s2.length() == 0) return 1;

        Iterator<String> words1 = splitString(s1).iterator();
        Iterator<String> words2 = splitString(s2).iterator();
                while (words1.hasNext() && words2.hasNext()) {
                        String word1 = words1.next();
                        String word2 = words2.next();

                                if (!word1.equals(word2))
                                return compareSubString(word1, word2);
                   }

                        if (words1.hasNext()) return 1;
                if (words2.hasNext()) return -1;

        return 0;
    }
    private static Iterable<String> splitString(String s) {
        List<String> result = new ArrayList<String>();
        Matcher match = Pattern.compile("\\d+|\\D+").matcher(s);

        while (match.find())
            result.add(match.group());

        return result;
    }
    private static int compareSubString(String s1, String s2) {

        try {
            int i1 = Integer.parseInt(s1);
            int i2 = Integer.parseInt(s2);
            return Integer.compare(i1, i2);
        } catch (NumberFormatException ignored) {
        }

        return s1.compareTo(s2);
    }
}
Код:
package tandemservice.test.task1;

import java.util.*;
public class Launcher {
    public static void main(String[] args) {
        ArrayList<String[]> rows = new ArrayList<String[]>();
        rows.add(new String[]{"11", "qwe123qweq"});
        rows.add(new String[]{"8", "123qwe21eew"});
        rows.add(new String[]{"7", "123qwe21ee"});
        rows.add(new String[]{"0", "f"});
        rows.add(new String[]{"0","f"});
        rows.add(new String[]{"1", ""});
        rows.add(new String[]{ "200qweqwe","4"});
        rows.add(new String[]{ "1qweqwee",null});
        rows.add(new String[]{ "123qwe21ee","6"});
        rows.add(new String[]{ "123qwe21e","9"});
        rows.add(new String[]{ "123qwe21ee22","10"});
        rows.add(new String[]{ "qwe12qwe","12"});
        System.out.println("Массив до сортировки:");// Выводим на экран массив до сортировки
        for (String[] o : rows)
            System.out.println(Arrays.asList(o));
        System.out.println("_______________________");
        System.out.println("Массив после сортировки:");// Выводим на экран массив после сортировки
        System.out.println("_______________________");
        /*TaskImpl obj = new TaskImpl();
        obj.sort(rows,0);*/

        TaskImpl.INSTANCE.sort(rows, 0);

        for (String[] a : rows)
            System.out.println(Arrays.asList(a));

    }
}

Последний раз редактировалось Fillip; 05.05.2016 в 08:01. Причина: новые входные данные
Fillip вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ создание интерфейса RoGGeR Помощь студентам 6 11.03.2015 07:48
Создание интерфейса DanZ Общие вопросы C/C++ 2 06.04.2014 13:48
Создание интерфейса _quaker Операционные системы общие вопросы 1 05.04.2014 07:47
Создание интерфейса kirieshka Помощь студентам 0 09.04.2011 22:41
Создание интерфейса hjVFY123 Свободное общение 5 25.09.2009 11:28