2016-03-25 12 views
1

Also ich habe eine Arraylist. Es hält derzeit ganze Zahlen. Ich möchte eine Liste von ganzen Zahlen erhalten, die nicht in der Arraylist aus einem bestimmten Bereich sind. Zum Beispiel, wenn der Zahlenbereich von 1 bis 5 ist, wenn die Arraylist 1,3,4 enthält, dann sollte die Ausgabe 2 und 5 sein. Die Zahlen, die in der ArrayList gespeichert sind, sollten ebenfalls eindeutig sein, daher denke ich an die Verwendung von Hashset. Das ist mein bisheriger Code:wie finde ich nummer die nicht in einer arraylist sind?

HashSet<Integer> abc = new HashSet<>(); 
      while(myrs.next()){ 
       try { 
        //RoomIdsThatAreCurrentlyReserved.add(Integer.parseInt(myrs.getObject(1).toString())); 
        abc.add(Integer.parseInt(myrs.getObject(1).toString())); 
       } catch (SQLException e) { 
        e.printStackTrace(); 

Mein Code liest im Grunde von einer Ergebnismenge. Hier

+2

Was ist damit nicht funktioniert? Sie können einfach 'for (i = 1; i <= 5; i ++)' loopen und 'i' drucken, wenn 'abc.contains (i)' '' false' ist. – dimo414

Antwort

0

ist einfaches Beispiel:

Arraylist a={1,2,3,4,5}; 
Arraylist b={2,3,4}; 

wenn Sie nicht eine Ausgabe wie 1 und 5. dann

verwendet einfach:

List<Integer> c = new ArrayList<>(a); 
c.removeAll(b); 
+0

OP möchte nur eine eindeutige Nummer * * Die in der ArrayList gespeicherten Zahlen sollten ebenfalls eindeutig sein * ' – Hiru

0

Warum Sie mögen dies nicht tun,

Iterator iterator = hashSet.iterator(); 

    while (iterator.hasNext()){ 
     int currentIteratorValue = (int) iterator.next(); 

     if(currentIteratorValue != 1 && currentIteratorValue != 3 && currentIteratorValue != 4){ 
      System.out.println(currentIteratorValue); //Prints 5 and 2 
     } 
    } 
0

Mit https://github.com/google/guava (Java 1,6)

 List<Integer> fullList = Lists.newArrayList(1, 2, 3, 4 , 5); 
     List<Integer> partOfList = Lists.newArrayList(1, 3, 4); 
     FluentIterable<Integer> missing = FluentIterable.from(fullList).filter(Predicates.not(Predicates.in(partOfList))); 
0

Es ist ein 1- Liner.

Gegeben:

List<Integer> list; // populated elsewhere 
// copy to a set if the list is large so it will perform better 
Set<Integer> set = new HashSet<>(list); 

Dann:

List<Integer> missing = IntStream.range(a, b) 
    .filter(i -> !set.contains(i)) 
    .collect(Collectors.toList()); 

Wenn die Liste klein ist, dass Sie den Satz überspringen und verwenden nur

.filter(i -> !list.contains(i)) 

aber das ist O(n) während der Satz enthält ist O(1).

1

Mit Eclipse Collections funktioniert das Folgende unter Verwendung von MutableSet. Verwenden Sie MutableSet hier, da Sie für die Verwendung von Set offen zu sein scheinen.

MutableSet<Integer> set = Sets.mutable.with(1, 2, 3, 4, 5); 
MutableSet<Integer> anotherSet = Sets.mutable.with(2, 3, 4); 

MutableSet<Integer> result = set.difference(anotherSet); 
System.out.println(result); //[1, 5] 

Hinweis: Ich bin ein Committer für Eclipse Collections.

Verwandte Themen