2017-07-14 6 views
-5

Comment puis-je obtenir List<Object> filteredList dont l'id (Object.id) contient dans un List<id> idsList donné d'une autre List<Object>allObjects. quelle sera la façon efficace et efficiente en termes de temps pour résoudre ce problème compte tenu d'un volume de données modéré.Obtenez tous les objets à partir d'une liste qui <object> id contient la liste <long>

J'utilise java6

+7

Eh bien, vous feriez mieux de commencer à travailler dessus. Stack Overflow n'est pas un type de demande/de type de site ... c'est un site Q and A – CraigR8806

+0

Hors sujet: Il y a rarement une telle chose comme "universel le plus efficace". Cela dépend de l'utilisation réelle – ControlAltDel

+0

Veuillez au moins mentionner la version Java que vous utilisez – Alexandr

Répondre

6

Je ne veux pas itérer à la fois la liste tant de fois

Pourquoi? L'optimisation prématurée est une mauvaise chose. Testez-le d'abord, mesurez s'il est suffisamment efficace et résolvez le problème s'il existe.

Vous pouvez y arriver avec des flux en utilisant un filtre simple:

class Student 
{ 
    long id; 
} 

final List<Student> students = /*something*/; 
final List<Long> rollNoList = /*something*/; 

List<Student> newStudents = students.stream() 
            .filter(student -> rollNoList.contains(student.id)) 
            .collect(Collectors.toList()); 

L'avantage de le faire avec des flux est que vous pourrez peut-être paralléliser plus tard.


Une optimisation supplémentaire consisterait à examiner votre utilisation des structures de données. Comme Seelenvirtuose rappelle, en utilisant quelque chose comme un HashSet réduira la complexité de contains de O (n) à O (1):

final Set<Long> rollNoList = new HashSet<>(); 

Si vous ne pouvez pas faire cela, vous pouvez voir le gain de performance, au coût de l'utilisation accrue de la mémoire, en copiant le List dans un HashSet avant de filtrer:

final Set<Long> rollNumbers = new HashSet<>(rollNoList); 

mais si vous avez le contrôle sur la structure de données, il suffit d'utiliser HashSet depuis le début.

+1

En fait, il est plus logique de convertir en premier le 'List ' en un 'Set '. De cette façon, l'appel à 'ids.contains' sera O (1) et non O (n) en coûts. Ne pas le faire est évidemment plus inefficace. – Seelenvirtuose

+0

Ça va être marrant quand il va utiliser ce code pour ce devoir et il essaie d'expliquer ce qu'il fait. –

+1

@rabbitguy Je suis généralement contre l'idée de suggérer des réponses basées sur les flux aux débutants, mais j'espère que c'est assez évident ce que cela fait. – Michael