Partage
  • Partager sur Facebook
  • Partager sur Twitter

tri fusion ne fonctionne pas

1 mai 2021 à 11:28:22

bonjour

j'ai une array list d'objet. chaque objet contient un id (entier), et des strings.

j'aimerais trier mon array list d'objet par id.

voici ce que j'ai implémenté (source : https://fr.wikibooks.org/wiki/Impl%C3%A9mentation_d%27algorithmes_classiques/Algorithmes_de_tri/Tri_fusion#Java_ou_C#)

public class Sort {
    public static void merge(ArrayList<Dico> list, int i, int k) {
        int j;

        if(i < k) {
            j = (i + k) / 2;
            merge(list, i, j);
            merge(list, j + 1, k);
            merged(list, i, j, k);
        }
    }

    private static void merged(ArrayList<Dico> list, int i, int j, int k) {
        ArrayList<Dico> tab = new ArrayList<>(list);

        int i1 = i;
        int i2 = j + 1;
        int i3 = i;
        while(i1 <= j && i2 <= k) {
            if(tab.get(i1).getInputId() <= tab.get(i2).getInputId())
                list.set(i3, tab.get(i1++));
            else
                list.set(i3, tab.get(i2++));

            i3++;
        }

        if(i3 <= k) {
            while(i1 <= j)
                tab.set(i3++, list.get(i1++));

            while(i2 <= k)
                tab.set(i3++, list.get(i2++));
        }
    }
}


mais je me retrouve avec des id que j'avais au depart (dans mon tableau list), mais plus à la fin dans mon tableau tab.

edit : si vous avez une solution avec tes methodes existante sans reinventer la roue, je suis preneur aussi

-
Edité par TagAda7 1 mai 2021 à 11:40:05

  • Partager sur Facebook
  • Partager sur Twitter
1 mai 2021 à 11:53:52

Salut,

as-tu testé l'algorithme du site avant ? As-tu recopié le code sans erreur (La ligne 30 et 33 sont-elles bonnes par rapport à l'algorithme de ton site) ?

Ton but est:

  • d'apprendre à faire un algorithme
  • trier un tableau ou une collection ? 

Pour trier un tableau / collection, il y a déjà des méthodes Java.

-
Edité par rybla 1 mai 2021 à 11:59:21

  • Partager sur Facebook
  • Partager sur Twitter
1 mai 2021 à 13:07:15

salut

je pense que j'ai bien recopié. c'est juste que j'ai simplifié les incrémentations.

non, mon but c'est juste de trier un tableau mais le truc c'est que je veux trier un tableau qui contient des objets dont la classe c'est moi qui l'ai faite.

et je n'arrive pas à trouver de solution sur internet

  • Partager sur Facebook
  • Partager sur Twitter
1 mai 2021 à 13:20:01

Je t'ai donné les solutions:

ou encore

        list.stream().sorted().forEach(System.out::println);
        list.stream().sorted((o1, o2) -> {
            // mettre la logique ici
            return 0;
        }).forEach(System.out::println);



  • Partager sur Facebook
  • Partager sur Twitter
1 mai 2021 à 13:49:47

Bonjour,

Collections.sort(list, Comparator.comparing(Dico::getInputId));

L'argument de comparing est une fonction qui spécifie la valeur utilisée comme critère de comparaison pour chaque élément.

Sinon, lignes 30 et 33, tu as inversé tab et list.

-
Edité par brubru777 1 mai 2021 à 13:54:37

  • Partager sur Facebook
  • Partager sur Twitter