Java: сортировка массива String, строки которого представляют int
У меня есть массив String[]
например
{"3","2","4","10","11","6","5","8","9","7"}
Я хочу сортировать его в цифровом порядке, а не в алфавитном порядке.
Если я использую
Arrays.sort(myarray);
Я получаю
{"10","11","2","3","4","5","6","7","8","9"}
вместо
{"2","3","4","5","6","7","8","9","10","11"}
Ответы
Ответ 1
Я думаю, что самый простой и эффективный способ преобразовать String
в int
s:
int[] myIntArray = new int[myarray.length];
for (int i = 0; i < myarray.length; i++) {
myIntArray[i] = Integer.parseInt(myarray[i]);
}
Затем сортируйте целочисленный массив. Если вам действительно нужно, вы всегда можете конвертировать обратно:
for (int i = 0; i < myIntArray.length; i++) {
myarray[i] = "" + myIntArray[i];
}
Альтернативным методом было бы использовать интерфейс Comparator, чтобы точно определить, как сравниваются элементы, но это, вероятно, означает преобразование каждого значения String
в int
любом случае, что делает вышеупомянутый подход более эффективным.
Ответ 2
Попробуйте пользовательский Comparator
, например:
Arrays.sort(myarray, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
}
});
Надеюсь, вам понравится!
Ответ 3
Ваш желаемый результат содержит порядковый номер соответствующих целых чисел. Таким образом, вы не можете избежать преобразования строк в целые числа. В качестве альтернативного компаратора к vikingsteve вы можете использовать это:
Arrays.sort(array, new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
return Integer.parseInt(str1) - Integer.parseInt(str2);
}
});
Ответ 4
U может использовать sol-1, если он содержит только числа в строковом формате.
Решение-1: -
String []arr = {"3","2","4","10","11","6","5","8","9","7"};
Set<Integer> set = new TreeSet<Integer>();
Arrays.sort(arr);
for(String s:arr){
System.out.print(s+" ");
set.add(Integer.parseInt(s));
}
System.out.println(set);
Integer i = new Integer("4f");
System.out.println(i);
Решение-2: -
String []arr = {"3","2","4","10","11","6","5","8","9","7","jgj","ek"};
Set<Integer> intSet = new TreeSet<Integer>();
Set<String> strSet = new TreeSet<String>();
Arrays.sort(arr);
for(String s:arr){
try {
int i = Integer.parseInt(s);
intSet.add(i);
} catch (NumberFormatException e) {
strSet.add(s);
}
}
List<String> result = new ArrayList<String>();
for(int val:intSet){
result.add(val+"");
}
result.addAll(strSet);
System.out.println(result);
}
Решение-3: -
Напишите один класс CustomComparator и передайте его методу sort().
public class CustomComparator implements Comparator<String>{
@Override
public int compare(String s1, String s2) {
Integer i1=null;
Integer i2=null;
try {
i1 = Integer.parseInt(s1);
} catch (NumberFormatException e) {
}
try {
i2 = Integer.parseInt(s2);
} catch (NumberFormatException e) {
}
if(i1!=null && i2!=null){
return i1.compareTo(i2);
}else{
return s1.compareTo(s2);
}
}
}
public static void main(){
String []arr = {"3","2","4","10","11","6","5","8","9","7","jgj","ek"};
Arrays.sort(arr, new CustomComparator());
for(String s:arr){
System.out.print(s+" ");
}
}
Ответ 5
Если все элементы, если ваш массив String представляет числа, и если числа всегда положительны, тогда существует простой способ сортировки численно без ограничения на значение числа.
Это основано на том факте, что число с большим числом цифр в этом случае всегда превышает число с меньшим числом цифр.
Сначала вы сравниваете количество цифр, а затем (только если количество цифр одинаково) вы сравниваете значение в алфавитном порядке:
Arrays.sort(array,
Comparator.comparing(String::length).thenComparing(Function.identity()));
Ответ 6
открытый класс test1 {
public static void main(String[] args)
{
String[] str = {"3","2","4","10","11","6","5","8","9","7"};
int[] a = new int[str.length];
for(int i=0;i<a.length;i++)
{
a[i]=Integer.parseInt(str[i]);
}
Arrays.sort(a);
for(int i=0;i<a.length;i++)
{
str[i]=String.valueOf(a[i]);
}
}
}
Ответ 7
Я нашел эту статью о сортировке строк с помощью числовой сортировки для строк, которые могут содержать или не содержать числа:
Алфавитный алгоритм
Существует пример реализации Java, связанный с этой статьей. С помощью этого класса вы сможете сортировать массивы численно следующим образом:
Arrays.sort(myarray, new AlphanumComparator());
Ответ 8
в jdk8 этот код можно написать с помощью лямбды.
List<String> list = Arrays.asList("3", "2", "4", "10", "11", "6", "5", "8", "9", "7");
list.sort(Comparator.comparingInt(Integer::valueOf));
list.forEach(System.out::println);
особенно такие, как ввод
String[]{"3.b", "2.c", "4.d", "10.u", "11.a", "6.p", "5.i", "8.t", "9.e", "7.i"}
Вы можете использовать string.subString, чтобы выбрать, какое значение вы действительно хотите отсортировать.
лайк
files.sort(Comparator.comparingInt(a -> Integer.valueOf(a.substring(0, a.indexOf(".")))));