web-dev-qa-db-fra.com

Java comment trier une liste chaînée?

J'ai besoin de trier une liste chaînée par ordre alphabétique. J'ai une liste chaînée remplie de noms de passagers et j'ai besoin que ce nom soit trié par ordre alphabétique. Comment ferait-on cela? Quelqu'un a des références ou des vidéos?

22
allencoded

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

29
mre

Pour trier les chaînes par ordre alphabétique, vous devrez utiliser une variable Collator, telle que:

 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 simplement Collections.sort(list), vous aurez des problèmes avec les chaînes contenant 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].

Remarque : Lorsque vous utilisez une Collator, vous pouvez spécifier les paramètres régionaux Collator.getInstance(Locale.ENGLISH), ce qui est généralement très pratique.

23
Federico Vera

En Java8, vous n'avez plus besoin d'utiliser la méthode Collections.sort car LinkedList hérite du tri de méthode de Java.util.List. Adaptez donc 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);
        }
    });

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
Tiago Lopo

Voici l'exemple pour trier la liste chaînée implémentée en Java sans utiliser aucune bibliothèque 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();
        }

    }
}
3
Vinayak Bansal

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 des expressions lambda:

list.sort((o1, o2) -> o1.compareToIgnoreCase(o2));
3
viniciussss
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;
}
2
iKushal

Je ne voudrais pas J'utiliserais une liste de tableaux ou une collection triée avec un comparateur. Trier une liste de liens est la procédure la plus inefficace à laquelle je puisse penser.

2
user207421

Si vous souhaitez savoir comment trier une liste chaînée sans utiliser de bibliothèques Java standard, nous vous conseillons d’examiner vous-même différents algorithmes. Exemples ici montre comment implémenter un tri par insertion, un autre article de StackOverflow montre un fusionner le tri , et ehow même donne quelques exemples sur la manière de créer une fonction de comparaison personnalisée au cas où vous souhaiteriez approfondir personnaliser votre tri.

0
Kyle

Vous pouvez le faire avec une expression Java 8 lambda:

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
Asaad Khurshid