# Anzahl der Punkte in einer IP Adresse zählen?



## Pago83 (27. Mrz 2007)

Hallo,

ich schreibe gerade verschiedene Testfälle für JUnit. Ein Testfall soll überprüfen, ob eine IP Adresse Gültigkeit besitzt, wobei nur die Anzahl der vorkommenden Punkte gezählt werden soll (192.168.2.1 = 3 Punkte).

Welche Methode muss ich zum Zählen der Punkte verwenden? Habe nach "count" oder ähnlichem gesucht, aber leider nicht das Richtige gefunden.

MfG Pago


----------



## SlaterB (27. Mrz 2007)

z.B.
Schleife:
charAt(i) == '.'


----------



## MASTERmind (27. Mrz 2007)

SlaterB hat gesagt.:
			
		

> z.B.
> Schleife:
> charAt(i) == '.'



und einen zaehler.

```
int counter = 0;
String ip =  "";
Schleife:
for (int i = 0; i <= ip.length(); i++)
ip.charAt(i) == ".";
counter ++;
```
usw.

und dann noch prüfen, ob "." auch an der richtigen stelle gesetzt.


----------



## Pago83 (27. Mrz 2007)

Habe jetzt folgenden Code programmiert, bekommen aber eine Fehlermeldung in der Zeile mit dem charAt. Bin absoluter Neuling, wahrscheinlich habe ich irgendetwas in der Schleife falsch gemacht.


```
@Test public void validFormatIPAddress()
	{
		String line = "ProxyPass /11111 http://15.105.2.10";
		List<String> list = new ArrayList<String>();
		list.add(line);
		IPIDParser testParser = new IPIDParser();
		List<KeyValue> keyValueList = testParser.parseLines(list);
		KeyValue keyValue = keyValueList.get(0);
		String value = keyValue.getValue();
		int counter = 0;
		String ip = value;
		for (int i = 0; i <= ip.length(); i++)
			ip.charAt(i) == ".";
		counter ++;
	}
```

Könnt ihr mir sagen wo der Fehler liegt?

MfG Pago


----------



## SlaterB (27. Mrz 2007)

erstmal solltest du dir überlegen was in der Schleife überhaupt passieren soll, 
ip.charAt(i) == "."; 
für sich ist weder korrektes Java noch macht es irgendwelchen Sinn,
das war nur ein Hinweis von mir, kein komplettes Programm

wenn du nicht einmal eine korrekte Anweisung schreiben kannst,
dann solltest du dich vorher mit den Java-Grundlagen vertraut machen


----------



## Pago83 (27. Mrz 2007)

Die Schleife soll den String durchgehen und nach dem "." suchen. Dann soll der Zahler erhöht werden. Kann mir niemand einen Tipp geben, was ich ändern muss?

MfG Pago


----------



## MASTERmind (27. Mrz 2007)

```
for (int i = 0; i <= ip.length(); i++)
{
  ip.charAt(i) == ".";
  counter ++;
}
```
das müsste glaube ich schon mal so aussehen!
sobald mehr als eine anweisung ==> klammer!

weiss aber noch nicht ob das zum funzen reicht(dicker kopf!)

formatiere deinen quellcode bitte ordentlich!!! lesbarkeit


----------



## thE_29 (27. Mrz 2007)

charAt liefert dir einen char und keinen String zurück!

Das fragt man mit ' ' und nicht mit " " ab!

if(ip.charAt(i) == '.')
counter++;


----------



## Pago83 (27. Mrz 2007)

Danke, jetzt funktioniert es.


----------



## mikachu (27. Mrz 2007)

noch einfacher gehts mit

```
String ip = "192.168.1.12";
int anzPunkte = ip.split(".").length - 1;
```


----------



## SlaterB (27. Mrz 2007)

aber Vorsicht, das ist eine vergleichsweise teure Operation,
dauert lange, erzeugt viele Objekte,

wenn man sie nicht gerade 10.000x einsetzt, ist es egal,
sollte man aber immer zumindest bedenken


----------



## mikachu (27. Mrz 2007)

ist auch richtig :wink:
aber am schnellsten geht es IMHO immer noch mit nem Iterator:

```
StringCharacterIterator sci = new StringCharacterIterator( "192.168.178.20" );

		int counter = 0;
		for( char c = sci.current(); c != StringCharacterIterator.DONE; c = sci.next() )
		{
			if( c == '.' )
				counter++;
		}
		System.out.println( counter );
```


----------



## thE_29 (27. Mrz 2007)

Warum sollte ein Iterator schneller sein als der direkte zugriff auf das char Array?!

Da der String ja intern alles in nem char array speichert!


----------



## mikachu (27. Mrz 2007)

also ich kann nur das wiedergeben, was mir mein Dozent beigebracht hat.
(sinngemäß)
Bei direktem Indexzugriff wird intern beim Index 0 begonnen, und dann soweit durchwandert, bis der gewünschte Index erreicht ist.
==> dauert bei langen Zeichenketten ziemlich lange

Bei nem Iterator funktioniert das wie ein Zeiger. Dieser wird nur beim Instantiieren des, ich beziehe mich auf das Beispiel, StringCharacterIterator-Objekts auf den Index 0 gesetzt, und läuft dann immer weiter durch, anhand des next()-Aufrufes.
==> dauert im Vergleich zu Index-Operation nicht so lange

So ist das zumindest in C++


----------



## SlaterB (27. Mrz 2007)

na sowas solltest du aber nicht weitergeben sondern deinem Dozenten eins auf die Mütze 

in einer modernen Programmiersprache ist ein Array-Index-Zugriff zum Glück schnell und nicht langsam,
puh, Glück gehabt


----------



## mikachu (27. Mrz 2007)

hab ja nix von langsam gesagt, nur nicht so schnell :wink:

aber java handlet ja intern eh alles als referenzen / zeiger, womit der Fakt der Zugriffsgeschwindigkeit auf einen Array-Index sich relativieren sollte.


----------



## SlaterB (27. Mrz 2007)

übrigens Implementierung dieses Iterators:


```
/**
     * Implements CharacterIterator.current() for String.
     * @see CharacterIterator#current
     */
    public char current()
    {
        if (pos >= begin && pos < end) {
            return text.charAt(pos);
        }
        else {
            return DONE;
        }
    }
```

nix neues, nur zusätzlicher Overhead


----------



## mikachu (27. Mrz 2007)

stimmt... da hätt ich auch selber können nachguggn :roll:

mir gefällt der StringCharacterIterator nur eben   :wink:


----------



## NTB (27. Mrz 2007)

es gibt fertige Reguläre Ausdrücke, mit denen man auf eine gültige IP testen kann.
Einfach mal suchen...


----------



## mikachu (27. Mrz 2007)

knapp am thema vorbei :wink:


----------



## thE_29 (27. Mrz 2007)

Naja, wieso es soll auf die Gültigkeit der IP überprüft werden!

Das geht entweder mit der Abfrage der punkte oder mit regex


----------

