Java сортирует числа в массиве - PullRequest
2 голосов
/ 01 января 2012

Я создал такой arraylist

ArrayList<String> entries = new ArrayList<String>();
entries.add("0 - name1");
entries.add("1000 - name2");
entries.add("1004 - name4");
entries.add("1002 - name3");
entries.add("10000 - name5");
entries.add("2000 - name5");

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

Как это можно сделать с помощью Java, можно ли использовать компаратор?

Ответы [ 6 ]

5 голосов
/ 01 января 2012

Да, это можно сделать с помощью Comparator, но он не будет очень эффективным, потому что вам нужно будет продолжать анализ данных, чтобы извлечь число, а затем вам нужно будет преобразовать число в целое и провести сравнение .

Лучше всего создать пользовательский объект с двумя свойствами: номером и именем. Тогда вы можете отсортировать по номеру. Компаратор для этого будет прямо вперед. Вы можете поискать на форуме примеры.

2 голосов
/ 01 января 2012

Могу ли я использовать компаратор?

да, вы можете:)

с синтаксисом: Collections.sort(entries,comparator); - вам нужно импортировать java.util.Collections инапишите компаратор, который делает то, что вы хотите.Вы также можете попробовать .sort(entries), используя компаратор по умолчанию (но здесь он не будет работать :)).

вот полное решение:

import java.util.Comparator;

public class MyComparator implements Comparator<String> {

    @Override
    public int compare(String arg0, String arg1) {

        int indexOf = arg0.indexOf("-");
        String substring = arg0.substring(0, indexOf-1);
        int indexOf1 = arg1.indexOf("-");
        String substring1 = arg1.substring(0, indexOf1-1);
        return Integer.valueOf(substring) - Integer.valueOf(substring1);
    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Runner {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<String> entries = new ArrayList<String>();
        entries.add("0 - name1");
        entries.add("1000 - name2");
        entries.add("1004 - name4");
        entries.add("1002 - name3");
        entries.add("10000 - name5");
        entries.add("2000 - name5");

        Comparator<String> comparator = new MyComparator();
        Collections.sort(entries, comparator );

        for (String e : entries){
            System.out.println(e);
        }

    }
}

Также - I сильно предлагаем объявить списки следующим образом: List<String> entries = new ArrayList<String>(); Позже вы можете найти преимущества использования LinkedList вместо ArrayList - тогда изменение реализации используемого списка будет максимально простым.

Plz google Msgstr "Программа для интерфейса, а не для реализации".:)

1 голос
/ 01 января 2012

Запишите Comparator<String>, который разделяет входы в -. Разобрать первый элемент с Integer.parseInt (обрезать при необходимости). Чем проводить сравнение с уточненными целочисленными значениями.
Код:

class MyComp implements Comparator<String> {
     public int compare(String s1, String s2) {
           int v1 = Integer.parseInt(s1.split("-")[0]);
           int v2 = Integer.parseInt(s2.split("-")[0]);
           return v1 - v2;
     }

}

0 голосов
/ 15 декабря 2012

Может быть, вы хотели бы попробовать мой алгоритм сортировки чисел:

package drawFramePackage;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Random;
public class QuicksortAlgorithm {
    ArrayList<AffineTransform> affs;
    ListIterator<AffineTransform> li;
    Integer count, count2;
    /**
     * @param args
     */
    public static void main(String[] args) {
        new QuicksortAlgorithm();
    }
    public QuicksortAlgorithm(){
        count = new Integer(0);
        count2 = new Integer(1);
        affs = new ArrayList<AffineTransform>();
        for (int i = 0; i <= 128; i++){
            affs.add(new AffineTransform(1, 0, 0, 1, new Random().nextInt(1024), 0));
        }
        affs = arrangeNumbers(affs);
        printNumbers();
    }
    public ArrayList<AffineTransform> arrangeNumbers(ArrayList<AffineTransform> list){
        while (list.size() > 1 && count != list.size() - 1){
            if (list.get(count2).getTranslateX() > list.get(count).getTranslateX()){
                list.add(count, list.get(count2));
                list.remove(count2 + 1);
            }
            if (count2 == list.size() - 1){
                count++;
                count2 = count + 1;
            }
            else{
            count2++;
            }
        }
        return list;
    }
    public void printNumbers(){
        li = affs.listIterator();
        while (li.hasNext()){
            System.out.println(li.next());
        }
    }
}
0 голосов
/ 01 января 2012

Насколько вы зависимы от этого ArrayList? Я не совсем уверен в вашем приложении, но формат «число - строка» ваших записей ArrayList подсказывает мне, что вам действительно нужна карта здесь. Реализуйте это как TreeMap, и вы получите сортировку ключей бесплатно.

public static void main( String[] args ) {
    Map<Integer , String> map = new TreeMap<Integer , String>();
    map.put( 1, "name1" );
    map.put( 1000, "name2" );
    map.put( 1004, "name4" );
    map.put( 1002, "name3" );
    map.put( 10000, "name5" );
    map.put( 2000, "name5" );

    for ( Integer key : map.keySet() ) {
        System.out.println( String.format( "key: %d, value: %s", key, map.get( key ) ) );
    }
}

... производит ...

key: 1, value: name1
key: 1000, value: name2
key: 1002, value: name3
key: 1004, value: name4
key: 2000, value: name5
key: 10000, value: name5
0 голосов
/ 01 января 2012

Вы можете использовать компаратор по умолчанию, используя Collections # sort при условии, что вы используете числа вида 01 и 02, а не 1 и 2.

В противном случае вы можете создать свой собственный компаратор, но я думаю, что @camickr лучше использовать другое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...