Java tableau [Résolu]

- 20 oct. 2015 à 17:13 - Dernière réponse :
Messages postés
12272
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
- 27 oct. 2015 à 16:18
Bonjour,
J'aimerais trouver la somme de deux tableaux et j'ai un problème dans mon code est ce que quelqu'un pourrait m'aider?
public static void uni(int[] TableauA, int a, int[] TableauB, int b, List<Integer> TableauD) {
    if (a >=TableauA.length|| b>=TableauB.length)
        return;
    if (TableauA[a]==TableauB[b]){
    TableauD.add(TableauA[a]);
    uni(TableauA,a+1,TableauB,b+1,TableauD);}
    else if(TableauA[a]>TableauB[b]){
    TableauD.add(TableauA[a]);
    uni(TableauA,a+1,TableauB,b,TableauD);}
    else uni(TableauA,a,TableauB,b+1,TableauD);
    
}
public static List<Integer> uni(int[] TableauA, int[] TableauB) {
    List<Integer> TableauD = new ArrayList<Integer>();
    uni(TableauA, 0, TableauB, 0, TableauD);
    return TableauD;
}
public static void main(String args[]){
int[] TableauA = {1,2,3,4};
    int[] TableauB = {1,2,3};
System.out.println(union(TableauA,TableauB));
  }


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

Votre réponse

9 réponses

Messages postés
15830
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 novembre 2018
20 oct. 2015 à 19:19
0
Merci
Bonjour,

Je n'ai pas testé, mais en lisant le code (bien que ce soit illisible sans les balises de code voir ici) je dirais :

1) la méthode union n'existe pas dans le main, c'est uni
2) tu ne devrais pas faire de add dans le deuxième cas puisqu'il n'y a pas égalité
Commenter la réponse de KX
0
Merci
l'union de deux tableaux dans le tableauD renvoit normalement les valeurs distinctes des deux tableaux.
le pseudo code consiste t il bien à:
- regarder si les valeurs des deux tableaux est identiques et de les ajouter dans le tableauD
-ajouter les valeurs non contenu dans les deux tableaux dans le tableauD
Messages postés
15830
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 novembre 2018
- 20 oct. 2015 à 21:24
"l'union de deux tableaux dans le tableauD renvoit normalement les valeurs distinctes des deux tableaux."

Bah non... l'union renvoie tout ce qui est dans au moins l'un des deux.
https://fr.wikipedia.org/wiki/Union_(mathématiques)
Commenter la réponse de tt
0
Merci
Les valeurs communes des deux tableaux ceSt pas plutôt l'intersection.lunion c'est plutôt la réunion des valeurs des deux tableaux.a={1,2,3}b={3,4,5}ça renvoie {1,2,3,4,5}
Messages postés
15830
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 novembre 2018
- 21 oct. 2015 à 08:22
L'exemple est bon.

Quelques cas de tests :

union([1,2,3],[4,5,6])=[1,2,3,4,5,6]
union([1,2,3],[1,2,3])=[1,2,3]
union([1,3,5],[2,4,6])=[1,2,3,4,5,6]
union([1,2,4,5],[2,3,5,6])=[1,2,3,4,5,6]
union([1,1,2,2],[2,2,3,3])=[1,2,3]
si le tableau A égale le tableau B on fait bien
if (TableauA[a]==TableauB[b]){
TableauD.add(TableauA[a]);
uni(TableauA,a+1,TableauB,b+1,TableauD);}
mais comment ajouter le cas où les valeurs sont inégales?
il faut aussi que j'ajoute
le cas où la taille des tableaux est différente
if(TableauA[a]>TableauB[b])
TableauD.add(TableauA[a]);
uni(TableauA,a+1,TableauB,b,TableauD);
else uni(TableauA,a,TableauB,b+1,TableauD);
Commenter la réponse de Tt
Messages postés
5293
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
19 novembre 2018
21 oct. 2015 à 09:03
0
Merci
Salut,

Si tu cherches à obtenir ce que KX te propose tu peux le faire assez simplement avec un Set et les méthodes dispo dans les classes Collections et Arrays
ex:

public static void main(String[] args) {
    print(union(new Integer [] { 1,2,3 }, new Integer [] { 4,5,6 }));
    print(union(new Integer [] { 1,2,3 }, new Integer [] { 1,2,3 }));
    print(union(new Integer [] { 1,3,5 }, new Integer [] { 2,4,6 }));
    print(union(new Integer [] { 1,2,4,5 }, new Integer [] { 2,3,5,6 }));
    print(union(new Integer [] { 1,1,2,2 }, new Integer [] { 2,2,3,3 }));
  }
  
  public static List<Integer> union(Integer [] a, Integer [] b) {
    Set<Integer> c = new TreeSet<Integer>();
    c.addAll(Arrays.asList(a));
    c.addAll(Arrays.asList(b));
    List<Integer> d = Arrays.asList(c.toArray(new Integer[] { }));
    Collections.sort(d);
    return d;
  }
  
  public static void print(List<Integer> list) {
    StringBuilder sb = new StringBuilder();
    sb.append("[");
    for(int i = 0; i < list.size(); ++i) {
      sb.append(list.get(i));
      if(i < list.size() - 1) sb.append(",");
    }
      
    sb.append("]");
    System.err.println(sb.toString());
  }
j'aimerais le faire avec de la récursivité et non les méthodes proposés dans la javadoc
Commenter la réponse de Twinuts
Messages postés
15830
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 novembre 2018
22 oct. 2015 à 07:44
0
Merci
Personnellement je ne vois pas 36 cas.

À tout moment dans l'exécution de ton programme, tu ne considères que 3 valeurs : le premier élément du tableauA, le deuxième élément du tableauB et le dernier élément du tableauD.

On considère la plus petite valeur entre A et B, si elle est différente de D on la rajoute, et dans tout les cas on passe au suivant...
Commenter la réponse de KX
0
Merci
je n'ai pas compris ce que vous avez essayé de m'expliquer pouvez vous me réexpliquer?
Messages postés
15830
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 novembre 2018
- 22 oct. 2015 à 19:19
Prenons par exemple ce cas de test :
union([1,2,4,5],[2,3,5,6])=[1,2,3,4,5,6]


tA = [1,2,4,5] → A=1
tB = [2,3,5,6] → B=2
tD = [] → D=

Entre A et B, le plus petit c'est 1, qui n'est pas la valeur de D.
Donc on l'ajoute et on passe au suivant.

tA = [/,2,4,5] → A=2
tB = [2,3,5,6] → B=2
tD = [1] → D=1

Entre A et B, le plus petit c'est 2, qui n'est pas la valeur de D.
Donc on l'ajoute et on passe au suivant.

tA = [/,/,4,5] → A=4
tB = [2,3,5,6] → B=2
tD = [1,2] → D=2

Entre A et B, le plus petit c'est 2, qui est la valeur de D.
Donc on ne l'ajoute pas et on passe au suivant.

tA = [/,/,4,5] → A=4
tB = [/,3,5,6] → B=3
tD = [1,2] → D=2

Entre A et B, le plus petit c'est 3, qui n'est pas la valeur de D.
Donc on l'ajoute et on passe au suivant.

tA = [/,/,4,5] → A=4
tB = [/,/,5,6] → B=5
tD = [1,2,3] → D=3

etc.
Commenter la réponse de tt
0
Merci
C'est bon j'ai trouve mais si le tableau n'était pas trié ça se passerait comment?
Messages postés
15830
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 novembre 2018
- 25 oct. 2015 à 10:03
Réponse courte : il faut trier tes tableaux avant de les fusionner.

Réponse longue : il y a plusieurs approches, mais on choisira généralement ce qui coûte le moins cher en terme de performance.

Il y a au moins deux cas possibles :
1) Tu tries d'abords les deux tableaux (en enlevant les doublons au passage), puis tu les fusionnes.
2) Tu concatènes les deux tableaux puis tu les tries (pour enlever les doublons).

En informatique on utilise la notion de complexité, c'est à dire une fonction qui relie la "taille" de la donnée à traiter, avec le nombre d'opérations nécessaires pour la traiter.

Dans ton cas :
f(n) serait le nombre d'opérations pour trier un tableau de taille n
g(n1,n2) pour fusionner deux tableaux triés de taille n1 et n2
h(n1,n2) pour concaténer deux tableaux quelconques

Donc avec mes deux cas on aurait :
1) f(n1)+f(n2)+g(n1,n2)
2) h(n1,n2)+f(n1+n2)

Remarque : avec un peu de chance le tri de t1 et t2 enlève des doublons donc en pratique on aura g(m1,m2) avec m1<=n1, m2<=n2, mais en théorie on considère le pire cas possible donc g(n1,n2).

Si on fait un petit calcul rapide, g(n1,n2)=n1+n2 avec l'algorithme que je t'ai donné. Et h(n1,n2)=n1+n2 aussi. Donc ça simplifie :

1) f(n1)+f(n2)+n1+n2
2) n1+n2+f(n1+n2)

Le choix repose donc (comme souvent) à comparer les algorithmes de tri.
Soit on a f(n1)+f(n2) < f(n1+n2) et il faut d'abord trier avant de fusionner.
Soit f(n1+n2) < f(n1)+f(n2), mais c'est théoriquement impossible.

Du coup, il est plus efficace de trier d'abord les tableaux avant de les fusionner.

Remarque : l'un des algorithmes de tri les plus performants est le tri par fusion, qui consiste à découper un grand tableau en petits tableaux pour les trier sur des petites tailles avant de les fusionner pour obtenir le tri du grand tableau.
Commenter la réponse de Tt
0
Merci
si le tableau n'est pas trié
peux t on appeler une méthode qui recherche un element dans un tableau?
comme ceci:
public static void unionnt(int[] TableauA, int rang,int[] TableauB, List<Integer> TableauU) {
if(recherche_non_trie(TableauA,1,0)== false ){
TableauU.add(TableauB[rang]);
unionnt(TableauA,rang+1,TableauB,TableauU);}
}

public static List<Integer> unionnt(int[] TableauA, int[] TableauB) {
List<Integer> TableauU = new ArrayList<Integer>();
unionnt(TableauA,0, TableauB,TableauU);
return TableauU;}


public static boolean recherche_non_trie(int Tableau_nonTrie[],int x,int rang){
if(rang>=Tableau_nonTrie.length) return false;
else if(Tableau_nonTrie[rang]==x) return true;
else return recherche_non_trie(Tableau_nonTrie,x,rang+1);
}
Pourquoi je n'ai rien en retour?
j'ai modifié le programme il me manquait des conditions.
public static void unionnt(int[] TableauA, int rang,int[] TableauB, List<Integer> TableauU) {
if(rang>=TableauA.length || rang>=TableauB.length) return;
if(recherche_non_trie(TableauA,1,0)== false ){
TableauU.add(TableauB[rang]);}
else {
TableauU.add(TableauA[rang]);
unionnt(TableauA,rang+1,TableauB,TableauU);}
}
il me retourne seulement 1,2,3,4
si:
int[] TableauA = {1,2,3,4};
int[] TableauB = {2,3,4,7};
Est ce que quelqu'un comprend pourquoi?
Commenter la réponse de tt
0
Merci
Quelqu'un pour m'aider?
Messages postés
12272
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
- 27 oct. 2015 à 16:18
Bonjour ton premier message a été corrigé par NHenry, KX dans sa première réponse t'a signalé que sans la coloration ton code est illisible.
Dans les 2 cas, ils t'ont mis un lien vers la procédure à appliquer.
Dans chacune de ses réponses, KX l'a utilisée, mais toi non...
Plus c'est difficile à lire et moins tu as de chance que quelqu'un le fasse.

D'autre part, il ne faut pas oublier que ce site est animé par des bénévoles et que nous avons d'autres occupations que d'y répondre.
Commenter la réponse de tt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.