2009-06-20 9 views
3

Je souhaite passer 2 tableaux à une fonction Java et les trier dans la fonction appelante. Comment puis-je utiliser une fonction pour accomplir cela?Tri des tableaux en Java

Je pourrais avoir la fonction retourner un objet avec 2 tableaux, mais y a-t-il une solution non orientée objet?

EDIT: Je cette situation particulière je ne peux pas utiliser la fonction intégrée Array.sort en Java. Disons que les 2 tableaux sont la hauteur et le poids. Ils ont la même longueur et le même indice correspond à la taille et au poids de la même personne sur les deux tableaux. Je veux trier le tableau de hauteur dans l'ordre croissant, tout en triant le tableau de poids correspondant au tableau de hauteur. L'utilisation de la fonction de tri gâcherait donc les relations entre les deux tableaux.

Répondre

4

Lorsque vous passez un tableau à une fonction, il n'est pas copié. Juste la référence de celui-ci est copiée et transmise à la fonction qui pointera vers le même endroit. Vous avez juste besoin de trier les tableaux sur place.

EDIT: Pour résoudre le problème de tri actuel, vous pouvez utiliser n'importe quel algorithme de tri pour trier le tableau height. La seule différence est que lorsque vous permutez deux éléments dans le processus de tri height, vous devez également permuter les éléments correspondants dans le tableau weight.

5
public void sort2(Object o1[], Object o2[]) 
{ 
    Arrays.sort(o1); 
    Arrays.sort(o2); 
} 

Un peu plus sophistiqué:

public <T> void sort2(T o1[], T o2[], Comparator<? super T> c) 
{ 
    Arrays.sort(o1, c); 
    Arrays.sort(o2, c); 
} 

EDIT: En règle générale, lorsque vous utilisez des réseaux parallèles, cela signifie que vous n'utilisez pas correctement les objets. Pour suivre votre exemple, vous devriez avoir une classe Person comparable avec des propriétés de taille et de poids. Bien sûr, comme l'a dit Mehrdad, vous pouvez implémenter manuellement un algorithme de tri en parallèle, mais ce n'est vraiment pas idéal.

0

Vous voulez donc que la fonction A appelle la fonction B. Puis B trier les tableaux et A récupérer le tableau trié?

Puisque les paramètres sont des références dans Java, si vous modifiez vos objets dans B, A verra les versions modifiées.

En C#, on peut même dire explicitement avec le mot-clé out, cela dit à tout le monde que la fonction va modifier le paramètre out.

+0

Ceci est faux. out signifierait que la variable objet de l'appelant [] pointerait vers un nouvel objet []. Ce n'est pas ce qui se passe ici. –

1

Bien que l'utilisation de deux tableaux séparés et la synchronisation de leur tri soient possibles, l'utilisation de ce type de solution peut entraîner des bogues difficiles à trouver ultérieurement. Par exemple, si les synchronisations entre les tableaux ne fonctionnent pas correctement, les mauvais poids peuvent correspondre aux hauteurs. Une façon d'éviter ce type de problème est d'encapsuler la hauteur/poids dans une classe afin qu'ils soient toujours synchronisés. Dans la figure 1, il y a une classe nommée Person qui a comme taille la taille, le poids et le nom. Si vous allez toujours trier par la hauteur ascendante, vous pouvez mettre en œuvre la méthode compareTo() comme le montre la figure 1.

La figure 2 montre un test JUnit pour montrer comment trier une liste de Person s. Le scénario de test montre également comment trier en fonction du poids. Dans les deux cas, il n'y a jamais de problème de synchronisation entre le poids et la hauteur puisque le tri est sur l'objet qui les encapsule.

Figure 1-Person classe



public class Person implements Comparable { 
    private Float height; 
    private Float weight; 
    private String name; 

    public Person(){} 

    public Person(Float height, Float weight, String name) { 
     this.height = height; 
     this.weight = weight; 
     this.name = name; 
    } 

    public Float getHeight() { 
     return height; 
    } 
    public void setHeight(Float height) { 
     this.height = height; 
    } 
    public Float getWeight() { 
     return weight; 
    } 
    public void setWeight(Float weight) { 
     this.weight = weight; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public int compareTo(Person other) { 
     //sort by height ascending 
     return this.height.compareTo(other.getHeight()); 
    } 
} 

Figure 2 - JUnit classe de test



import junit.framework.TestCase; 
import java.util.*; 

public class PersonTest extends TestCase { 

    private List personList = new ArrayList(); 

    public PersonTest(String name) { 
     super(name); 
    } 

    public void testCompareTo() { 
     personList.add(new Person(72F,125F,"Bob"));// expect 3rd when sorted by height asc 
     personList.add(new Person(69.9F,195F,"Jack"));// expect 2nd when sorted by height asc 
     personList.add(new Person(80.05F,225.2F,"Joe"));// expect 4th when sorted by height asc 
     personList.add(new Person(57.02F,89.9F,"Sally"));// expect 1st when sorted by height asc 
     Collections.sort(personList); 
     assertEquals("Sally should be first (sorted by height asc)",personList.get(0).getName(),"Sally"); 
     assertEquals("Jack should be second (sorted by height asc)",personList.get(1).getName(),"Jack"); 
     assertEquals("Bob should be third (sorted by height asc)",personList.get(2).getName(),"Bob"); 
     assertEquals("Joe should be fourth (sorted by height asc)",personList.get(3).getName(),"Joe"); 

     Collections.sort(personList,new Comparator() { 
      public int compare(Person p1, Person p2) { 
       //sort by weight ascending 
       return p1.getWeight().compareTo(p2.getWeight()); 
      } 
     }); 
     assertEquals("Sally should be first (sorted by weight asc)",personList.get(0).getName(),"Sally"); 
     assertEquals("Bob should be second (sorted by weight asc)",personList.get(1).getName(),"Bob"); 
     assertEquals("Jack should be third (sorted by weight asc)",personList.get(2).getName(),"Jack"); 
     assertEquals("Joe should be fourth (sorted by weight asc)",personList.get(3).getName(),"Joe");  
    } 

} 

0

Vous pouvez retourner un tableau de tableaux ou d'un objet qui contient deux tableaux. Cependant, il semble que les valeurs dans les deux tableaux doivent être corrélées, donc vous devriez vraiment avoir un tableau d'objets qui contient les deux valeurs.

BTW: Je n'utiliserais jamais Float et flotterais j'éviterais aussi bien (comme il seulement précis à 6 endroits) je suggérerais d'utiliser int, long ou double.