2009-10-06 5 views
0

Existe-t-il un moyen simple de vérifier et d'ajuster les paramètres pour rester à l'intérieur des limites de la liste?Vérification simplifiée des limites pour la liste Java

Voici un long échantillon:

if (fromIndex < 0) { 
    fromIndex = 0; 
} 
if (fromIndex > list.size() - 1) { 
    fromIndex = list.size() - 1; 
} 

if (toIndex < 0) { 
    toIndex = 0; 
} 
if (toIndex > list.size() - 1) { 
    toIndex = list.size() - 1; 
} 

list.subList(fromIndex, toIndex); 

Je sais que je pourrais passer list.size() - 1 à une variable et faire un extrait méthode sur les contrôles d'index pour supprimer le code redondant. Mais il semble encore un peu verbeux pour cette tâche simple.

Répondre

5
public int sanitize(int index) { 
    return Math.max(0, Math.min(index, this.length-1)); 
} 
+0

petite note: 'list' ou' listSize' devrait également être un paramètre – naltatis

+0

@tatilans: true, dans le contexte de cet extrait qui ressemble un peu à un méthode statique. Cependant, la suggestion de Brian d'envelopper une liste existante est une bien meilleure façon de le réaliser (code plus flexible, moins intrusif, moins répandu) et dans ce cas, la liste serait probablement un champ membre final. –

+0

OK. Je l'ai changé pour this.length. Si cela ajoute juste plus de confusion, je vais revenir en arrière :) – Zed

3

Si vous voulez vérifier tous les accès à votre liste, il me semble que vous voulez envelopper votre liste dans une classe qui implémente l'interface List et intercepter les méthodes d'accès pour vérifier/modifier les indices accesseurs.

par exemple.

List sanitised = new SanitisedList(existingList); 

Voici un exemple du motif Decorator. Notez comment vous avez juste besoin d'une classe définie (SanitisedList) et vous pouvez l'appliquer à n'importe quelle liste que vous avez. Utilisez Zed's answer pour une vérification des limites bien rangé.

0

Vous pouvez utiliser l'opérateur ternaire:

int listMax = list.size() - 1; 
list.subList(fromIndex < 0 ? 0 : (fromIndex > listMax) ? listMax : fromIndex, 
       toIndex < 0 ? 0 : (toIndex > listMax) ? listMax : toIndex); 
Questions connexes