2009-05-27 5 views
3

J'ai déjà fait la tête à ce sujet - et je pense que c'est simple, mais ma géométrie/algèbre est assez moche, et je ne me souviens pas comment faire ça depuis mes études! J'ai une liste de coordonnées avec les gens qui se tenaient près d'eux - j'ai besoin d'un algorithme pour ordonner les gens de haut en bas à gauche dans une liste (tableau), et le second critère exige que les coordonnées qui sont plus proches l'origine en haut à gauche prends des précisions sur tous les autres - comment feriez-vous cela?Problème de coordonnées de commande

Le code doit montrer l'ordre:

  1. Tom
  2. Harry
  3. Bob
  4. Dave

Voir schéma ci-dessous:

alt text

+0

En fait, je ne vois rien de géométrique dans le problème que vous avez décrit ci-dessus. Au début je pensais aux coordonnées polaires mais dans ton problème le simple tri acheter y et x sera une solution. – Roman

+0

et si Bob était à (60, 74)? si Bob ou Harry d'abord? – user101884

Répondre

8

À partir de votre commande, il semble que vous mettez position y à une priorité plus élevée que la position de x, donc quelque chose comme ça pourrait fonctionner lorsque l'on compare deux personnes:

if (a.y > b.y) 
// a is before b 
else if (a.x < b.x) 
// a is before b 
else 
// b is before a 

modifier la mise à jour Cette comparaison encore travaille avec vos nouveaux critères. La position Y a toujours la priorité sur la position X. Si les valeurs Y sont égales, le point le plus proche du coin supérieur gauche serait celui avec la valeur X la plus petite. Si vous voulez faire de votre objet un comparateur, mettre en œuvre ce que votre fonction comparateur vous permettra de faire ArrayList.sort() où signifie négatif la première personne est avant la seconde:

public int compareTo(person a, person b) { 
    if (a.y == b.y) 
     return a.x-b.x 
    else 
     return b.y-a.y 
} 

//compareTo(Tom, Harry) == -50 (tom is before harry) 
//compareTo(Tom, Bob) == -25 (tom is before bob) 
//compareTo(Dave, Bob) == 30 (dave is after bob) 
+1

Au lieu de "plus grand", vous devriez dire "avant". Les routines de tri Java intégrées sont triées par ordre croissant, donc dire "plus grand" est déroutant. Mais au moins vous avez la bonne comparaison dans la dimension y, donc +1. – erickson

+0

corrigé, merci (15 caractères) –

+0

Pour choisir un 'nit', 'a.x-b.x' peut déborder - il suffit d'utiliser' a.x greybeard

1

Si vous connaissez pour max magnitude de X, trier par (pour votre exemple donné) 100 * (100 - Y) + X.

+0

Ou plutôt 100 * X - Y basé sur son système de coordonnées choisi;) – jerryjvl

+0

Erk ... X - 100 * Y même ... cerveau geler :) – jerryjvl

+0

Vous avez raison, mais je pense que vos deux formules sont incorrectes; édité. –

2

Ordonnez-les en fonction de leur distance du coin supérieur gauche de votre 2D-Space, dans ce cas (0, 100).

EDIT:

Évidemment, cela signifie que vous aurez les cas où 2 personnes sont à égale distance du coin en haut à gauche, et pourtant ils sont loin les uns des autres.

Dans ce cas, vous devez spécifier comment vous souhaitez que ces personnes soient commandées. Si vous voulez choisir des personnes qui sont plus haut, vous pouvez commander par y-coord en premier. De même, vous pouvez choisir un autre critère.

Tous les autres algorithmes de tri auront le même problème, que faire lorsque 2 éléments ont la même clé de tri. Par définition, ils sont considérés comme identiques jusqu'à ce que vous trouviez un critère de tri secondaire.

+0

cela ne fonctionnerait pas - parce que si vous aviez quelqu'un à (0,0) et quelqu'un à (100,100) ils seraient équidistants de (0,100) - merci bien – Vidar

+0

c'est un bon début. s'ils sont équidistants, alors ils sont équivalents, c'est-à-dire "poire" et "poire" dans une liste ou vous avez besoin d'un critère secondaire – user101884

+0

Vous voulez les commander de haut à gauche en bas à droite. En l'absence d'autres critères de classement, quelqu'un (0, 0) est dans le même bateau que quelqu'un à (100, 100). Si vous voulez que l'algorithme préfère un ordre plutôt qu'un autre, vous devez spécifier comment il doit se comporter. – sykora

0

Le comparateur ressemble à ceci:

int d = o2.y - o1.y; 
if (d == 0) 
    d = o1.x - o2.x; 
return d; 

Ce sera d'abord trier par Y, puis par X (pour tous les objets qui ont la même Y).

[EDIT] Correction de l'ordre de tri en Y.

+0

Cela trie la mauvaise direction dans la dimension y (Tom.y - Dave.y = +15, donc ils seraient permutés). – erickson

1

Je dirais:

orderValue = x+(100-y) 

Ensuite, en fonction du type plus petit orderValue étant le plus « proche » (selon la distance projetée sur la ligne y = 100 x) vers le haut gauche .

Questions connexes