You are not logged in.

wcf.regNote.message

logix

Trainee

  • "logix" started this thread

Posts: 78

  • Send private message

1

Thursday, March 2nd 2006, 12:31am

Problem beim Vergleichen von Array-Einträgen

Hallo Jungs.

Ich hab folgendes Problem und hoffe ihr könnt mir weiterhelfen.

Ich habe eine Array, das Objekte enthält, in denen String-Variablen für Schülernamen stehen. Ich will jetzt überprüfen, ob es Namen doppelt gibt.

Das ist mein Vorschlag für die Datenstrucktur:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class TSchueler
{
    String Name, Vorname;
    int Note;
    
    public TSchueler(String Nam, String Vorn, int Not)
    {
        Name = Nam;
        Vorname = Vorn;
        Note = Not;
    }
}


public class TKurs
{
    TSchueler [] Schuelerliste;
    
    public TKurs()
    {
        Schuelerliste = new TSchueler [18];
    }
    
    public void Schuelerliste_belegen(int Position, TSchueler TSchuelerObjekt)
    {
        Schuelerliste[Position-1] = TSchuelerObjekt;
    }
    
    public int Name_doppelt()
    {
        int Übereinstimmungen = 0;	// Namensübereinstimmungen die es in zwei identischen Schuelerlisten gibt

        for (int i=0; i<=17; i++)
        {
            for (int j=0; j<=17; j++)
            {
                if (Schuelerliste[i].Name == Schuelerliste[j].Name)
                {
                    Übereinstimmungen = Übereinstimmungen + 1;
                }
            }
        }
        
        return Übereinstimmungen;
    }
}


Leider hab ich ein Problem.
Nach meiner Theorie müsste:
1 1
2 2
3 3
3 Übereinstimmungen in der Summe ergeben und:
1 1
1 1
3 3
5 Übereinstimmungen.
In Java gibt es aber in beiden Fällen 3 Übereinstimmungen.

Hilfe! :kotzen:

Ephraim

Professional

Posts: 826

Location: coder-board.info

Occupation: Info-Student

  • Send private message

2

Thursday, March 2nd 2006, 9:36am

Des mit den Übereinstimmungen Fall1 is klar ... Fall2 kapier ich jetzt nicht,
wie soll er denn index1 und index1 zweimal vergeleichen?

erklär dein Prob bitte mal an nem bissel genauerem Beispiel :(

Ciao Ephraim

logix

Trainee

  • "logix" started this thread

Posts: 78

  • Send private message

3

Thursday, March 2nd 2006, 3:55pm

Okay ich versuchs.

Nur mal angenommen das Listenfeld hätte drei Namen.

Tobi
Inge
Kata

dann würde doch auch 3 zurück gegeben werden.

Wenn jetzt einen Name doppelt drin ist, z.B. so:

Tobi
Tobi
Kata

müsste er doch nach den zwei for-Schleifen 5 zurückgeben.

Daraus wollte ich dann schließen:

Übereinstimmungen > Länge der Liste = Doppelte Einträge
und
(Übereinstimmungen - Länge der Liste) / 2 = Anzahl der doppelten Einträge


Das passiert leider aber nicht, und ich kann mir nicht erklären warum.

Ich hab zum testen mal die Methode verwendet:

Source code

1
2
3
4
5
6
7
    public void automatisch_belegen()
    {
        for (int i=0; i<=17; i++)
        {
            Schuelerliste[i] = new TSchueler("Name "+i, "Vorname "+i, i);
        }
    }

Wenn ich anschließend public int Name_doppelt() ausführe gibt er auch 18 zurück.

Wenn ich jetzt einen Namen doppelt habe gibt er aber auch 18 zurück.

Und wenn ich einen Namen drei mal habe gibt er 20 zurück...

Edit

Quoted

Des mit den Übereinstimmungen Fall1 is klar ... Fall2 kapier ich jetzt nicht,

Mit den Zahlen meinte ich einfach nur die Namen, nicht den Index :)

This post has been edited 1 times, last edit by "logix" (Mar 2nd 2006, 4:01pm)


Avelyn

Trainee

Posts: 78

Location: Österreich

  • Send private message

4

Thursday, March 2nd 2006, 10:46pm

Dein Code zählt die Doppelten Einträge zwei mal. Und das wars. Addiere den Wert einfach noch zu der Anzahl an Einträgen hinzu und du kannst mit daraus das hier schließen:

Übereinstimmungen > Länge der Liste = Doppelte Einträge
(Übereinstimmungen - Länge der Liste) / 2 = Anzahl der doppelten Einträge

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Vector<TSchueler> vec = new Vector<TSchueler>();
int i = 0, j = 0;
int size = 0;
int same = 0;

// Dann hald irgendwo deine Schueler einfügen

size = vec.size();
for (; i < size; ++i )
{
   for (; j < size; ++j)
   {
      if ( vec[i].Name.equals(vec[j].Name) && i != j )
      {
          ++same;
      }
   }
}
same += size;
// jetzt kannst du deine schlussfolgerungen machen
"Beware of bugs in the above code; I have only proved it correct, not tried it" - Donald Knuth

logix

Trainee

  • "logix" started this thread

Posts: 78

  • Send private message

5

Thursday, March 2nd 2006, 11:04pm

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public int Name_doppelt()
    {
        int Anzahl = 0;
        for (int i=0; i<=17; i++)
        {
            for (int j=0; j<=17; j++)
            {
                if (!(i == j))
                {
                    if (Schuelerliste[i].Name == Schuelerliste[j].Name)
                    {
                        Anzahl ++;
                    }
                }
            }
        }
        return Anzahl;
    }

Das geht genauso wenig, obwohl bei zwei gleichen Einträgen 1 zurückgegeben werden müsste.
Habt ihr noch einen anderen Vorschlag?

Edit
Thx Avelyn. mein post war zu spät

This post has been edited 1 times, last edit by "logix" (Mar 2nd 2006, 11:09pm)


Avelyn

Trainee

Posts: 78

Location: Österreich

  • Send private message

6

Friday, March 3rd 2006, 12:01pm

Quoted

Original von logix
Edit
Thx Avelyn. mein post war zu spät


Liebend gern... :)
"Beware of bugs in the above code; I have only proved it correct, not tried it" - Donald Knuth

logix

Trainee

  • "logix" started this thread

Posts: 78

  • Send private message

7

Friday, March 3rd 2006, 7:45pm

Ich hab mir das nochmal überlegt! Schöner wärs so:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public int Name_doppelt()
    {
        int Anzahl = 0;
        for (int i=0; i<=17; i++)
        {
            for (int j=(i+1); j<=17; j++)
            {
                if (Schuelerliste[i].Name == Schuelerliste[j].Name)
                {
                    Anzahl ++;
                }
            }
        }
        return Anzahl;
    }


Wobei ich da wieder am verzweifeln bin, weil ich nicht verstehe, dass wenn es keine doppelten Einträge gibt oder es einen doppelten Eintrag gibt, beides mal 0 zurückgegeben wird.

Ich habs mir so vorgestellt (zur Vereinfachung nur 3 Namen):

Erster Fall
-----------

1: Tobi
2: Inge
3: Kata

Ablauf:

Tobi == Inge
Tobi == Kata
Inge == Kata

Anzahl = 0



Zweiter Fall
------------

1: Tobi
2: Inge
3: Inge

Ablauf:

Tobi == Inge
Tobi == Inge
Inge == Inge (Anzahl++)

Anzahl = 1



Vielleicht kannst du mir nochmal sagen warum das so nicht ist, ich wills nämlich kapieren. X( Merci schon mal

Avelyn

Trainee

Posts: 78

Location: Österreich

  • Send private message

8

Saturday, March 4th 2006, 8:49pm

Hast du schonmal mit equalsIgnoreCase() probiert?

Source code

1
2
3
4
if (Schuelerliste[i].Name.equalsIgnoreCase(Schuelerliste[j].Name))
{
   ++Anzah;
}


Vielleicht hast du in der Liste einen Unterschied in der Gross/Kleinschreibung denn ma einfach übersehen haben...

lg Av'
"Beware of bugs in the above code; I have only proved it correct, not tried it" - Donald Knuth

logix

Trainee

  • "logix" started this thread

Posts: 78

  • Send private message

9

Sunday, March 5th 2006, 1:56am

*PeinlichGug* :O

Ja, es lag in der tat daran, dass ich beim Testen nicht exakt die gleichen Namen hatte... Danke!

Leider verhält sich die Rückgabe nicht proportional.

1x der Name = 0
2x der Name = 1
3x der Name = 3
4x der Name = 6
5x der Name = 10
6x der Name = 15
...

Aber ich kann dennoch die doppelten Namen berechnen.
Dazu rechne ich ?rückwärts?:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    public int Name_doppelt()
    {
        int Anzahl = 0;
        
        for (int i=0; i<=17; i++)
        {
            for (int j=(i+1); j<=17; j++)
            {
                if (Schuelerliste[i].Name == Schuelerliste[j].Name)
                {
                    Anzahl ++;
                }
            }
        }
        
        int Subtrahend = 0;
        
        while (Subtrahend < Anzahl)
        {
            Anzahl = Anzahl - Subtrahend;
            Subtrahend ++;
        }
        
        return Anzahl;
    }


Jetzt bin ich zufrieden :D :prost:

Avelyn

Trainee

Posts: 78

Location: Österreich

  • Send private message

10

Sunday, March 5th 2006, 10:16pm

Na dann... *g* :prost:
"Beware of bugs in the above code; I have only proved it correct, not tried it" - Donald Knuth

wcf.user.socialbookmarks.titel