Здравствуйте, ребята! Подскажите, пожалуйста, как улучшить код...
Программа должна сортировать переданный список записей, строка бьется на подстроки следующим образом: выделяем непрерывные максимальные фрагменты строки, состоящие только из цифр, и считаем набором подстрок эти фрагменты и все оставшиеся от такого разбиения фрагменты строки
при сравнении строк осуществляется последовательное сравнение их подстрок до первого несовпадения, если обе подстроки состоят из цифр - то при сравнении они интерпретируются как целые числа (вначале должно идти меньшее число), в противном случае - как строки.
Ниже приведенный код сортирует по первой колонке(и числа, и, если подставить, строки), но результат выдает некорректный... Как можно исправить?
Код:
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.INSTANCE.sort(rows, 0);
for (String[] a : rows)
System.out.println(Arrays.asList(a));
}
}