2016-04-26 20 views
-1

Wir haben eine Liste von Strings-Elementen. Zum Beispiel [A, B, B, A, K, B]. Unser Programm muss diese Liste auf die nächsten Chargen [["A", "B", "K"], ["B", "A"], ["B"]] aufteilen. Alle Butches müssen nur eindeutige Elemente enthalten, die Anzahl der Batches muss minimal sein und die Komplexität des Algorithmus muss linear O (n) sein.Geteilte Liste auf eindeutigen Chargen

+2

klingt wie ein Hausaufgaben ..., was Sie bisher getan versuchen ? Wo ist das Problem? – MrSimpleMind

+1

Wahrlich Hausaufgaben, sorry, wir können nicht helfen: D Versuchen Sie es, produzieren Sie einen Fehler, posten Sie Ihren Code hier und fragen Sie nach diesem bestimmten Fehler;) –

Antwort

0

ich normalerweise nicht beantworten, wenn die Fragen wie ein Hausaufgaben sieht, was ich denke, es ist. Aber gut ... hier ist eine nette und einfache Lösung mit List, Set und . (Wenn Sie über die Reihenfolge egal, ersetzen dann HashSet mit LinkedHashSet)


import java.util.*; 

public class StringBatches { 
    public static void main(String[] args) { 
     String[] ss = {"A","B","B","A","K","B", "A"}; 

     List<Set<String>> l = new ArrayList<Set<String>>(); 
     for (String s : ss) { 
      putInUniqueSet(l, 0, s); 
     } 
     System.out.println(l); 
    } 

    public static boolean putInUniqueSet(List<Set<String>> l, int idx, String s) { 
     if(l.size() <= idx) 
      l.add(new HashSet<String>()); 
     return !l.get(idx).add(s) ? putInUniqueSet(l, idx+1, s) : true; 
    } 
} 

Ausgang:

[[A, B, K], [A, B], [A, B]] 
+0

Können Sie die Erklärung zur Rückgabe erklären? Niemals so etwas gesehen: D – Ofir

+1

Nun, die 'add (s)' wird 'true' zurückgeben, wenn' set' das 's' nicht bereits enthält. Was bedeutet, wenn "s" neu im Set ist, dann ist es in Ordnung. Andernfalls, wenn "s" existiert, dann versuche, das "s" in das nächste existierende "set" unter Verwendung der Rekursion zu setzen. Bis "s" ein 'set' findet, das' s' nicht enthält ... wenn Sie die Verwendung von '?'und': 'seine Art von einem if sonst stmnt, ein ternärer Operator https://en.wikipedia.org/wiki/%3F: – MrSimpleMind

0

Versuchen Sie, die Liste zu verwenden und festzulegen. Ihr Set erlaubt keine doppelten Werte und List erlaubt. Sie können also über alle Elemente hinweg iterieren und beim Hinzufügen zur Menge prüfen, ob die Länge geändert wurde und ob die Länge nicht geändert wurde, bedeutet, dass es doppelt ist und es der Liste hinzugefügt wird. Ihr nächster Satz wird also die Liste sein. und mach weiter so, es sei denn, deine Listengröße ist null. Es ist nur ein Hinweis darauf, dass dies hilft.

Happy Learning :)

+0

Was meinst du mit gesetzt? – Ofir

+0

Set ist eine Datenstruktur in Java, die keinen doppelten Wert erlaubt. –

0

Dieser sollte funktionieren. (Und wurde getestet)

ArrayList<ArrayList<String>> batches = new ArrayList<ArrayList<String>>(); 
    ArrayList<String> arr = new ArrayList<String>(); 

    arr.add("A"); 
    arr.add("B"); 
    arr.add("B"); 
    arr.add("A"); 
    arr.add("K"); 
    arr.add("B"); 
    arr.add("A"); 

    batches.add(new ArrayList<String>()); 

    int id = 0, arrID = 0; 

    while(arrID < arr.size()) 
    { 
     if(batches.get(id).contains(arr.get(arrID))) 
     { 
      id ++; 
      if(id+1 > batches.size()) 
       batches.add(new ArrayList<String>()); 
     } 
     else 
     { 
      batches.get(id).add(arr.get(arrID)); 
      arrID ++; 
      id = 0; 
     } 
    } 

    System.out.println("Results: "); 
    for(int i=0; i<batches.size(); i++) 
    { 
     System.out.println("Batch "+i); 
     for(int x=0; x<batches.get(i).size(); x++) 
      System.out.println(batches.get(i).get(x)); 
    } 
+0

Fehler behoben. – Ofir

+0

zu langsame Lösung) – Faorest23

+0

Was meinst du? Ich kann es optimieren :) – Ofir

0

ich wahrscheinlich

Paket dummy eine Liste von Listen

zB tun würde;

importieren java.util.ArrayList; importieren java.util.List;

public class BatchIt {

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    List<List<String>> batches = new ArrayList<List<String>>(); 
    List<String> firstBatch = new ArrayList<String>(); 
    batches.add(firstBatch); 
    for (String input : args) { 
     boolean inputAdded = false; 
     for (List<String> batch : batches) { 
      if(!batch.contains(input)){ 
       batch.add(input); 
       inputAdded = true; 
       break; 
      } 
     } 
     if(!inputAdded){ 
      List<String> nextBatch = new ArrayList<String>(); 
      nextBatch.add(input); 
      batches.add(nextBatch); 
     } 
    } 
    System.out.print(batches); 
} 

}