2009-12-10 2 views
1

J'ai une liste javaComment puis-je créer une liste java en utilisant les variables membres d'une liste existante, sans utiliser de boucle for?

List<myclass> myList = myClass.selectFromDB("where clause"); 

//myClass.selectFromDB returns a list of objects from DB 

Mais je veux une autre liste, plus précisément.

List<Integer> goodList = new ArrayList<Integer>(); 

for(int i = 0;i++; i<= myList.size()) { 
    goodList[i] = myList[i].getGoodInteger(); 
} 

Oui, je pourrais faire une autre requête de la DB dans la création de myList initiale, mais suppose pour l'instant, je dois l'utiliser comme point de départ et pas d'autres requêtes DB. Puis-je remplacer la boucle for par quelque chose de beaucoup plus efficace?

Merci beaucoup pour toute contribution, excuses pour mon ignorance.

Répondre

3

Afin d'extraire un champ de la "myclass", vous allez devoir parcourir le contenu entier de la liste. Que vous le fassiez avec une boucle for, ou que vous utilisiez une sorte de construction qui vous cache la boucle for, cela prendra encore à peu près le même temps et utilisera la même quantité de ressources.

3

Une question importante est: pourquoi voulez-vous faire cela? Essayez-vous de rendre votre code plus propre? Si oui, vous pourriez écrire une méthode le long de ces lignes:

public static List<Integer> extractGoodInts (List<myClass> myList) { 
    List<Integer> goodInts = new ArrayList<Integer>(); 

    for(int i = 0; i < myList.size(); i++){ 
     goodInts.add(myList.get(i).getGoodInteger()); 
    } 

    return goodInts; 
} 

Ensuite, dans votre code, vous pouvez simplement aller:

List<myClass> myList = myClass.selectFromDB("where clause"); 
List<Integer> goodInts = myClass.extractGoodInts(myList); 

Toutefois, si vous essayez de rendre votre code plus efficace et vous n'êtes pas autorisé à modifier la requête, vous n'avez pas de chance; D'une façon ou d'une autre, vous devrez attraper individuellement chaque int de la liste, ce qui signifie que vous allez courir en O (n), peu importe les astuces que vous pouvez trouver.

+1

Vous ne pouvez pas créer une liste dans Java –

+0

Notez également que cette méthode est statique qui signale un défaut de conception potentiel. Il devrait en fait être une méthode membre d'une classe qui enveloppe la liste. Faites-le et vous avez le début d'un design OO réel ici ... –

+0

Don: Bon appel sur la chose int. Cela fait longtemps que j'ai utilisé Java. Bill K: D'accord, bien que le fait d'envelopper la Liste puisse être quelque peu exagéré pour quelque chose comme ça. Je suis d'accord avec vous que la conception OO pourrait être plus propre, mais je pourrais argumenter que c'est une complexité inutile, et ne devrait être refactorisée comme ça si nous finissons par répéter ce code pour d'autres types (Doubles, Strings, etc.) et d'autres tables. – jakeboxer

0

Il n'y a vraiment que deux façons que je peux penser que vous pouvez le rendre plus « efficace »:

  1. D'une certaine façon SPLIT entre plusieurs cœurs afin que vous puissiez faire le travail en parallèle. Bien sûr, cela suppose que vous avez d'autres cœurs, qu'ils ne font déjà rien d'utile, et qu'il y a suffisamment de traitement pour que cela soit vraiment utile. Ma conjecture est que (au moins) le dernier point n'est pas vrai dans votre cas étant donné que vous appelez simplement un getter. Si vous vouliez faire cela, vous devriez essayer d'avoir un certain nombre de threads (j'utiliserais probablement un Executor and Futures pour cela) égal au nombre de cœurs, et ensuite donner des quantités de travail à peu près égales à chacun d'entre eux (probablement juste en découpant votre liste en morceaux de taille à peu près égale).

  2. Si vous croyez que vous n'allez accéder qu'à un petit sous-ensemble de la liste résultante, mais que vous ne savez pas exactement quels éléments, vous pouvez essayer de faire les choses paresseusement. La manière la plus simple de le faire serait d'utiliser une implémentation de liste de mappage paresseuse pré-construite. Il y en a un au Google Collections Library. Vous l'utilisez en appelant le Lists.transform(). Il retournera immédiatement une liste, mais il ne fera que votre transformation sur les éléments tels qu'ils sont demandés. Encore une fois, ceci est seulement plus efficace s'il s'avère que vous regardez seulement une petite fraction de la liste de sortie. Si vous finissez par regarder tout cela, ce ne sera pas plus efficace, et vous travaillerez probablement pour être moins efficace.

0

Vous ne savez pas ce que vous entendez par efficace. Comme les autres l'ont dit, vous devez appeler la méthode getGoodInteger sur tous les éléments de cette liste d'une manière ou d'une autre.A propos du mieux que vous pouvez faire est d'éviter la vérification de la size chaque fois:

List<Integer> goodInts = new ArrayList<Integer>(); 
for (MyClass myObj : myList) { 
    goodInts.add(myObj.getGoodInteger()); 
} 

I suggestion de deuxième aussi jboxer de faire fonction à cet effet.

+1

Vous ne pouvez pas créer de liste en Java –

+0

Bon point. Fixé. – Dan

Questions connexes