2016-11-15 5 views
0

Ich habe eine Zeichenfolge Arraylist unter, dass ich Elemente aus ["AA00001", "AA00005", "AA00003" ----- "ZZ00678" übergeben müssen, und ich muss die Sequenzelemente generieren, die nicht sind in der Liste vorhanden. Ich habe Code dafür geschrieben und für weniger Eingaben erzeugt er die erforderliche Ausgabe. Aber wenn ich das Hinzufügen 22184 Elemente und will 200 eindeutige IDs erzeugen, die in der Arraylist nicht vorhanden sind i Störung erhalten alsWie finde ich die fehlenden Elemente in einer Sequenz?

Der Code der Methode main (String []) überschreitet die 65.535 Bytes begrenzen

Kann jemand bitte helfen?

import java.util.ArrayList; 

public class GenerateIds 
{ 
    private static ArrayList<String> ids = new ArrayList<>(); 
    static int n=50; //no of Ids u want to generate 
    static int completed =0; 
    static char ID[] = new char[7]; 
    public static void main(String[] args) 
    { 
     ids.add("AA00001"); 
     ids.add("AA00004"); 
     ids.add("AA00007"); 
     generateIds(0); 
     for(String id : ids) 
     { 
      System.out.println(id); 
     } 
    } 


    private static void generateIds(int i) 
    { 
     if(n!=completed) 
     { 
      if(i<2) 
      { 
       for(char c ='A';c<'Z';c++) 
       { 
        ID[i]=c; 
        generateIds(i+1); 
       } 
      } 
      else if(i>=2 && i<7) 
      { 
       for(char c ='0';c<='9';c++) 
       { 
        ID[i]=c; 
        generateIds(i+1); 
       } 
      }else if(i==7) 
      { 
       String id = String.valueOf(ID); 
       if(!ids.contains(id)) 
       { 
        ids.add(id); 
        completed++; 
       } 
      } 
     } 
    } 
} 
+1

Dieser Code überschreitet definitiv nicht die Grenze von 64k. Es läuft gut auf ideone] (http://ideone.com/MwiiUQ). –

+0

Sie könnten Ihre IDs in eine Textdatei schreiben und die Textdatei lesen. – matt

+0

Wenn Sie alle 'ids.add (" AA00001 "); IDS.add ("AA00004"); ids.add ("AA00007"); ... 'in Ihrer Hauptmethode überschreitet es leicht das Limit, weil es zu groß wird. Es wäre besser, eine externe Datei mit allen IDs zu haben und diese in Ihre Liste einzulesen. – QBrute

Antwort

0

Sie können Ihre IDs in eine Textdatei einfügen. Dann benutze sowas wie.

List<String> ids = Files.readAllLines(Paths.get("ids.txt")); 
0

in Java ein Verfahren nicht mehr als 65535 Byte hat.

Die wichtigste Methode auch immer groß, da Sie alle tun, fügt inline:

ids.add("AA00001"); 
ids.add("AA00004"); 
ids.add("AA00007"); 
... 

Dies wird die wichtigste Methode zu lang. Was können Sie dies lösen (und die fehlenden Elemente zu finden) ist es, alle String-Werte in einer Liste und Schleife über sie setzen die fehlenden Elemente zu finden:

public void findMissingElements() { 

    List<String> missingIds = allPossibleIds.stream() 
              .filter(isMissingIn(existingIds)) 
              .collect(toList()); 

    //do something with the missingIds... 

} 

Wie andere Leser wie matt vorgeschlagen , können Sie z Lege alle Strings in eine Datei und lies die Datei.

Ich schrieb ein kleines Beispiel, um zu zeigen, wie alles zusammen funktionieren würde. Ich habe Ihre generateIds Methode mit jOOλ umgeschrieben, um alle möglichen IDs zu generieren und sie in allPossibleIds umzubenennen (Ihre rekursive Methode würde aber auch funktionieren). Ich beschränkte die IDs auf eine 3-stellige Ziffernzahl, um die Suchzeit als Beispiel zu begrenzen.

public class FindMissingIdsTest { 

    private List<String> allPossibleIds; 
    private List<String> existingIds; 

    @Before 
    public void setup() throws IOException { 
    allPossibleIds = allPossibleIds(); 
    existingIds = retrieveIdsFromSubSystem(); 
    } 

    @Test 
    public void findMissingElements() { 

    List<String> missingIds = allPossibleIds.stream() 
              .filter(isMissingIn(existingIds)) 
              .collect(toList()); 

    } 

    private Predicate<String> isMissingIn(List<String> existingIds) { 
    return possibleId -> !existingIds.contains(possibleId); 
    } 

    public List<String> allPossibleIds(){ 
    List<String> alphabet = Seq.rangeClosed('A', 'Z').map(Object::toString).toList(); 
    List<String> letterCombinations = Seq.seq(alphabet).crossJoin(Seq.seq(alphabet)).map(t -> t.v1 + t.v2).toList(); 
    List<String> numbericParts = IntStream.range(0, 1000) 
              .mapToObj(i -> String.format("%03d", i)) 
              .collect(toList()); 

    return Seq.seq(letterCombinations).crossJoin(Seq.seq(numbericParts)).map(t -> t.v1 + t.v2).toList(); 
    } 

    public List<String> retrieveIdsFromSubSystem() throws IOException { 
    return Files.readAllLines(Paths.get("ids.txt")); 
    } 

} 

Um wieder auf 5 Ziffern zu wechseln, können Sie einfach die 1000 zu 100000 und die% 03d zu% 05d ändern.

Wenn Sie die Liste bestellen können, könnten Sie wahrscheinlich einen schnelleren und besseren Algorithmus finden. Alles hängt von der Situation ab. z.B. Wenn Sie eine sortierte Liste haben, können Sie den Stream aller IDs erstellen, darüber iterieren und der vorhandenen Liste mit einem Zeiger folgen, anstatt immer eine Ressource zu verwenden, die verbraucht.

Verwandte Themen