Java comment trier une Liste chaînée?

je dois trier une liste Par Ordre alphabétique. J'ai une liste de noms de passagers et j'ai besoin que le nom des passagers soit classé par ordre alphabétique. Comment pourrait-on le faire? Quelqu'un a des références ou des vidéos?

21
demandé sur allencoded 2011-06-06 06:05:38

9 réponses

vous pouvez utiliser Collections#sort pour trier les choses par ordre alphabétique.

28
répondu mre 2014-10-02 19:00:50

pour trier les chaînes par ordre alphabétique, vous devrez utiliser un Collator , comme:

 LinkedList<String> list = new LinkedList<String>();
 list.add("abc");
 list.add("Bcd");
 list.add("aAb");
 Collections.sort(list, new Comparator<String>() {
     @Override
     public int compare(String o1, String o2) {
         return Collator.getInstance().compare(o1, o2);
     }
 });

parce que si vous appelez Collections.sort(list) vous aurez des problèmes avec les chaînes qui contiennent des caractères majuscules.

par exemple dans le code que j'ai collé, après le tri la liste sera: [aAb, abc, Bcd] mais si vous appelez simplement Collections.sort(list); vous obtiendrez: [Bcd, aAb, abc]

Note : Lorsqu'on utilise un Collator vous pouvez spécifier la locale Collator.getInstance(Locale.ENGLISH) c'est habituellement assez pratique.

22
répondu Federico Vera 2017-11-20 15:28:30

dans java8 vous n'avez plus besoin d'utiliser les Collections.la méthode sort comme LinkedList hérite de la méthode sort de java.util.List, donc adapter la réponse de Fido à Java8:

    LinkedList<String>list = new LinkedList<String>();
    list.add("abc");
    list.add("Bcd");
    list.add("aAb");

    list.sort( new Comparator<String>(){
    @Override
        public int compare(String o1,String o2){
            return Collator.getInstance().compare(o1,o2);
        }
    });

, les Références:

http://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html

http://docs.oracle.com/javase/7/docs/api/java/util/List.html

8
répondu Tiago Lopo 2015-01-29 19:16:49

Voici l'exemple pour trier la liste liée implémentée en java sans utiliser de bibliothèques java standard.

package SelFrDemo;

class NodeeSort {
    Object value;
    NodeeSort next;

    NodeeSort(Object val) {
        value = val;
        next = null;

    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

    public NodeeSort getNext() {
        return next;
    }

    public void setNext(NodeeSort next) {
        this.next = next;
    }

}

public class SortLinkList {
    NodeeSort head;
    int size = 0;

    NodeeSort add(Object val) {
        // TODO Auto-generated method stub
        if (head == null) {
            NodeeSort nodee = new NodeeSort(val);
            head = nodee;
            size++;
            return head;
        }
        NodeeSort temp = head;

        while (temp.next != null) {
            temp = temp.next;
        }

        NodeeSort newNode = new NodeeSort(val);
        temp.setNext(newNode);
        newNode.setNext(null);
        size++;
        return head;
    }

    NodeeSort sort(NodeeSort nodeSort) {

        for (int i = size - 1; i >= 1; i--) {
            NodeeSort finalval = nodeSort;
            NodeeSort tempNode = nodeSort;

            for (int j = 0; j < i; j++) {

                int val1 = (int) nodeSort.value;
                NodeeSort nextnode = nodeSort.next;
                int val2 = (int) nextnode.value;
                if (val1 > val2) {

                    if (nodeSort.next.next != null) {
                        NodeeSort CurrentNext = nodeSort.next.next;
                        nextnode.next = nodeSort;
                        nextnode.next.next = CurrentNext;
                        if (j == 0) {
                            finalval = nextnode;
                        } else
                            nodeSort = nextnode;

                        for (int l = 1; l < j; l++) {
                            tempNode = tempNode.next;
                        }

                        if (j != 0) {
                            tempNode.next = nextnode;

                            nodeSort = tempNode;
                        }
                    } else if (nodeSort.next.next == null) {
                        nextnode.next = nodeSort;
                        nextnode.next.next = null;
                        for (int l = 1; l < j; l++) {
                            tempNode = tempNode.next;
                        }
                        tempNode.next = nextnode;
                        nextnode = tempNode;
                        nodeSort = tempNode;

                    }

                } else
                    nodeSort = tempNode;
                nodeSort = finalval;
                tempNode = nodeSort;
                for (int k = 0; k <= j && j < i - 1; k++) {
                    nodeSort = nodeSort.next;
                }

            }

        }
        return nodeSort;

    }

    public static void main(String[] args) {
        SortLinkList objsort = new SortLinkList();
        NodeeSort nl1 = objsort.add(9);
        NodeeSort nl2 = objsort.add(71);
        NodeeSort nl3 = objsort.add(6);
        NodeeSort nl4 = objsort.add(81);
        NodeeSort nl5 = objsort.add(2);

        NodeeSort NodeSort = nl5;

        NodeeSort finalsort = objsort.sort(NodeSort);
        while (finalsort != null) {
            System.out.println(finalsort.getValue());
            finalsort = finalsort.getNext();
        }

    }
}
4
répondu Vinayak Bansal 2016-09-30 10:46:01

solution élégante depuis JAVA 8:

LinkedList<String>list = new LinkedList<String>();
list.add("abc");
list.add("Bcd");
list.add("aAb");

list.sort(String::compareToIgnoreCase);

une autre option serait d'utiliser les expressions lambda:

list.sort((o1, o2) -> o1.compareToIgnoreCase(o2));
4
répondu viniciussss 2017-06-30 04:18:50
Node mergeSort(Node head) {
    if(head == null || head.next == null) {
        return head;
    }

    Node middle = middleElement(head);
    Node nextofMiddle = middle.next;
    middle.next = null;

    Node left = mergeSort(head);
    Node right = mergeSort(nextofMiddle);

    Node sortdList = merge(left, right);

    return sortdList;
}

Node merge(Node left, Node right) {
    if(left == null) {
        return right;
    }

    if(right == null) {
        return left;
    }
    Node temp = null;
    if(left.data < right.data) {
        temp = left;
        temp.next = merge(left.next, right);
    } else {
        temp = right;
        temp.next = merge(left, right.next);
    }

    return temp;
}

Node middleElement(Node head) {
    Node slow = head;
    Node fast = head;
    while (fast != null && fast.next != null && fast.next.next != null) {
        fast = fast.next.next;
        slow = slow.next;
    }
    return slow;
}
3
répondu iKushal 2017-05-18 09:42:50

Je ne le ferais pas. J'utiliserais un ArrayList ou une collection triée avec un comparateur. Le tri D'une liste de liens est la procédure la plus inefficace à laquelle je puisse penser.

1
répondu user207421 2011-06-06 04:56:20

si vous voulez savoir comment trier une liste liée sans utiliser les bibliothèques Java standard, je vous suggérerais d'examiner vous-même des algorithmes différents. Exemples ici montrent comment mettre en œuvre un tri d'insertion, un autre poteau de débordement montre un tri de fusion , et ehow donne même quelques exemples sur la façon de créer une fonction de comparaison personnalisée dans le cas où vous voulez personnaliser davantage votre Tri.

0
répondu Kyle 2017-05-23 10:31:31

vous pouvez le faire par Java 8 lambda expression:

LinkedList<String> list=new LinkedList<String>();
list.add("bgh");
list.add("asd");
list.add("new");
//lambda expression
list.sort((a,b)->a.compareTo(b));
0
répondu Asaad Khurshid 2018-08-14 18:38:29