# Regex - JTable - Filter



## martin82 (17. Mrz 2010)

Hi,

ich bin dabei eine Filterfunktion auf einer JTable anzuwenden. Ich hab jetzt das Problem bei einem Größer oder Kleiner Filter auf einen String.
In einer Spalte werden Kundennummern als String dargestellt und ich möchte den Filter realisieren welcher zB alle kleiner "B001" rausfiltert. Kann man sowas mit einem regexFilter machen?


----------



## Tomate_Salat (17. Mrz 2010)

natürlich:

```
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegEXcampel 
{
    public static void main(String[] args) 
    {
        String[] zahlen = { "b001", "bcad002", "101", "bc011d", "010.d" };
        
        for(String z :  zahlen)
            System.out.println( "Zahl: " + RegEXcampel.getZahl(z));
    }
    
    public static int getZahl(String reg)
    {
        Pattern p   = Pattern.compile("[\\D]*+(\\d++).*+");
        Matcher m   = p.matcher( reg );
        
        if(m.find())
        {
            return Integer.parseInt( m.group(1) );
        }
        
        return -1;
    }
}
```

Ausgabe:

```
Zahl: 1
Zahl: 2
Zahl: 101
Zahl: 11
Zahl: 10
```


----------



## martin82 (17. Mrz 2010)

Das heißt aber ich muss mir zuerst eine Wert vom String erzeugen lassen und diesen dann verarbeiten(eigenen Filter schreiben). Direkt mit RowFilter.regexFilter gehts nicht oder?


----------



## Tomate_Salat (17. Mrz 2010)

habe jetzt noch nie mit dem Filter gearbeitet, aber u.U ginge es so:[c].regexFilter("\\d")[/c]

*Edit:* Oder vllt so:

```
RowFilter<Object, Object> filter    = new RowFilter<Object, Object>()
        {
            @Override
            public boolean include(RowFilter.Entry<? extends Object, ? extends Object> entry) 
            {
                int kundenSpalte    = 0;
                String zelle        = entry.getValue(kundenSpalte).toString();
                
                int nummer          = RegEXcampel.getZahl(zelle);
                
                return (nummer != -1);
            }
        };
```

[DUKE]Ungetestet[/DUKE]


----------



## martin82 (17. Mrz 2010)

Ja ok, aber was ich eigentlich will ist nicht die reine Zahl des Strings, sondern den gesamten String als Wert...
Aber das kann ich ja mit comparTo dann abgleichen. Wollte eigentlich nur wissen ob ich extra einen eigenen Filter schreiben muss oder direkt regexFilter() verwenden kann.


----------



## Tomate_Salat (17. Mrz 2010)

martin82 hat gesagt.:


> welcher zB alle kleiner "B001" rausfiltert.



Dafür würde ich halt die Zahl verwenden. Zum Vergleichen



martin82 hat gesagt.:


> Kann man sowas mit einem regexFilter machen?


ich würde sagen: Nein. Denn mittels regex überprüfst du die Struktur eines Strings. Wäre die Zahl einstellig, dann vllt.

Und falls doch: Dann ist der Regex höchstwahrscheinl. mehr Arbeit und komplizierter als wie wenn du die rückgegebene Zahl auf seinen Wert überprüfst

Aber ich denke nicht, dass es allzuviel Arbeit wäre, meinen RowFilter anzupassen,dass er die wünsche erfüllt. 

Anmerkung: Sieht die Kundennummer so aus: b012a20 dann erkennt er hier nur die 12 und nicht 1220!


----------



## faetzminator (17. Mrz 2010)

Die Frage ist, was wie sortiert werden soll. Zuerst [A-Z]+ mit compareTo() (ZZ > AAA) oder als "math. Wert" (AAA > ZZ)? Danach, wenn (AAA == AAA, ZZ == ZZ) auf \d+ mit dem Zahlenwert? ...


----------



## martin82 (17. Mrz 2010)

Tomate_Salat hat gesagt.:


> Dafür würde ich halt die Zahl verwenden. Zum Vergleichen



Aber dann kann ich nicht >"B001" filtern. Dann würde zB "A002" aufscheinen und das will ich ja nicht.

Habs jetzt so gelöst:


```
String kundenSpalte;

RowFilter<Object, Object> lessFilter    = new RowFilter<Object, Object>()
        {
            @Override
            public boolean include(RowFilter.Entry<? extends Object, ? extends Object> entry) 
            {
               return kundenSpalte.compareTo(entry.getValue(spalte).toString())<0;
            }
        };
```


----------



## Tomate_Salat (17. Mrz 2010)

ich kapier immernoch nicht ganz nach was du da genau wie filtern willst. Naja egal, hast ja jetzt eine lösung von daher passts ja ;-)


----------



## martin82 (17. Mrz 2010)

Ok dann trotzdem nochmal mit Beispiel:

Hab folgende Werte: {"A009","B021","C177","E001","F053","M100","T099"}

Filter: >"E001". Ergebnis soll sein: {"F053","M100","T099"}
Filter: <="E001". Ergebnis soll sein: {"A009","B021","C177","E001"}
Filter: <"B021". Ergebnis soll sein: {"A009"}


----------



## Tomate_Salat (17. Mrz 2010)

also vgl auf den Buchstaben + die darauf folgende zahl. Könnte man auch mit dem Pattern/Matcher machen^^. Aber ich glaube die [c]compareTo[/c] ist hier eleganter.


----------

