2017-09-06 2 views
0

In meinem Programm habe ich verschiedene SzenarienJava: Wie kann man Filter anwenden?

Am Anfang wie folgt festgelegt wird leer sein:

[] 

Benutzer können Werte in der Menge dynamisch hinzufügen lassen sagen Benutzer eingeben beginnen und enden ganze Zahlen als 2 und 6, Satz wird wie folgt sein:

[2,3,4,5,6] 

A) Welche Benutzer tun kann:

Nach Benutzer kann wie diese lassen Sie sich sagen Benutzer eingeben 1 und 2, Satz wie folgt sein:

[1,2,3,4,5,6] 

Benutzer auch wie diese lassen Sie können sagen Benutzer eingeben 6 und 8, Satz wird wie folgt sein:

[1,2,3,4,5,6,7,8] 

B) Welche Benutzer nicht tun kann, ist dies:

Lassen Sie sagen Benutzer eingeben 2 und 6 als 2,3,4,5,6 in dem Satz bereits vorhanden ist, so Programm ausgeben sollte Fehlermeldung an den Benutzer.

Benutzer kann auch nicht, sagen wir Benutzer geben 0 und 10 als 0, 1,2,3,4,5,6,7,8, 9,10 bold Ganzzahlen sind bereits im Set, so Programm sollte eine Fehlermeldung an den Benutzer ausgeben.

C) Endergebnis:

Am Ende Satz wie dieses [1,2,3,4,5,6,7,8]

-Update sollte:

Benutzer auch, wie dies tun können, sagen am Anfang leer gesetzt ist wie folgt:

[] 

Benutzer geben 1 ein und 3-Set wird so sein:

[1,2,3] 

Afterwords Benutzer eingeben 5 und 7, wird Set wie dies:

[1,2,3,5,6,7] 

Nach Benutzern eingeben 3 und 5, Set wie diese

werden
[1,2,3,4,5,6,7] 

Wie kann ich dies erreichen, würde jede Hilfe sehr geschätzt werden.

Was ich versucht habe bisher nicht funktioniert:

Scanner reader = new Scanner(System.in); 

System.out.println("Enter a start: "); 
int s = reader.nextInt(); 

System.out.println("Enter a end: "); 
int e = reader.nextInt(); 

Set<Double> filterSet = new TreeSet<>(); 


for (int i = s; i <= n; i++) {    
    if(filterSet.stream().allMatch(x -> x>=s && x<=e)){ 
     System.out.println("Error"); 
     } 
     else{ 
      filterSet.add(i); 
      } 
} 
+0

'Was ich bisher versucht habe, funktioniert nicht:' Bitte erläutern. –

+0

Warum benötigen Sie einen Filter, um dies zu implementieren? Sie können direkt hinzufügen verwenden. –

+0

Es sieht so aus, als würden Sie nur einen Eingabebereich anfordern. Sollte es keine Eingangsschleife geben? – shmosel

Antwort

0

ich erreicht, was ich unter Verwendung Google Guava der RangeSet Schnittstelle wollte. Danke an @shmosel, der mich darauf hingewiesen hat.

Scanner reader = new Scanner(System.in); 

System.out.println("Enter a start: "); 
int s = reader.nextInt(); 

System.out.println("Enter a end: "); 
int e = reader.nextInt(); 

RangeSet<Integer> rangeSet= TreeRangeSet.create(); 

      if(rangeSet.isEmpty()){ 
       System.out.println("1 Empty"); 
       rangeSet.add(Range.closed(s, e)); 
      }else { 
       System.out.println("1 Not Empty"); 
       if(!rangeSet.encloses(Range.closed(s, e)) && !rangeSet.intersects(Range.open(s, e))){ 
        System.out.println("2 Yes"); 
        rangeSet.add(Range.closed(s, e)); 
       }else{ 
        System.out.println("2 No"); 
       } 
      } 
      System.out.println("Range: " + rangeSet) 
3

Der Grund Stream Ausdruck nicht funktioniert, weil Ihre Definition eines Bereichs nicht konsistent ist. Diese Inkonsistenz erzeugt viele Randfälle, die Sie testen müssen, wenn Sie entscheiden, ob das Ergebnis gültig ist oder nicht.Einige Beispiele (von Ihrem Update):

Beginnend mit einem leeren Satz, Ø, verbindet es mit [1,3] (beachten Sie, dass es sich um eine abgeschlossene Menge von Mathematik) gibt das Ergebnis {1,2,3}

Union das vorherige Ergebnis mit [5,7] (geschlossen weiteres gesetzt), was zu {1,2,3,5,6,7}

Union, die mit (3,5) (Hinweis, dass diese eine offene Menge ist) resultieren inresultierende

Wenn Sie hier anhalten, können Sie eine kohärente Regel erstellen, bei der die Berechnung als erfolgreich betrachtet wird, wenn die cardinality des Ergebnisses größer als die Kardinalität des ursprünglichen Satzes |currentValue| > |previousValue| ist. Sie haben jedoch ein Beispiel in Ihrem ursprünglichen Post angegeben, in dem Sie die Union [0,10] mit [1,8] berechnet haben, wo diese Regel fehlschlägt (d. H. Werte {0,9,10} wurden zu dem Satz hinzugefügt). Obwohl die Kardinalität des Ergebnisses 11 größer ist als die Kardinalität des vorherigen Werts 8, wird die Berechnung als Fehler betrachtet.

könnten Sie auch großzügig sein und betrachten alle neuen Eingänge offen Sätze sein, [1,8] ∪ (0,10) ⇔ [1,8] ∪ [1,9] (Bekanntmachung der Wechsel von offen bis geschlossen Sätze), aber dies würde immer noch in einer Änderung zur Folge haben, dass Sie nicht erwartet hatten (9 hinzugefügt wurde zum Set), daher die Notwendigkeit, Randfälle zu testen.

Ein ähnlicher Fall liegt vor, wenn Sie mit dem Satz [2,6] (dh {2,3,4,5,6}) und Vereinigung mit [1,2) (Mitteilung der teilweise offene Menge), die sich ergibt in [1,6] (dh {1,2,3,4,5,6}) beginnen, die als Erfolg betrachtet wird, selbst obwohl es zu einer einzigen Änderung wie im vorherigen Beispiel kommt. In diesem Fall wird das Element 1 zu dem Set hinzugefügt, eher das Element 9.

In einem Fall habe ich am Ende der Sequenz ein Element hinzugefügt und im anderen Fall habe ich das Element am Anfang der Sequenz hinzugefügt. Warum sollten diese anders behandelt werden?

Sie sollten keine qualitativ hochwertige Antwort auf Ihre Frage erwarten, bis Sie einen konsistenten Weg gefunden haben, um zu bestimmen, ob das Ergebnis gültig ist.

See: notation

Verwandte Themen