Finde meinen Fehler nicht! - Namen von Personen vergleichen

Status
Nicht offen für weitere Antworten.
also ich wollte ein programm machen, das eine person in einen vector einfügt und dann nach dem alphabet ordnet, nur ordnet er das nicht nach dem alphabet hier erstmal der code:


die Klasse Test: hier wird meine "Person" erstellt:


Code:
/*
 * Test.java
 *
 * Created on 12. August 2005, 17:17
 */

package Bsp_41_test;

/**
 *
 * @author  michi
 */
public class Test {
    private String fname;
    private String sname;
    /** Creates a new instance of Test */
    public Test(String fname, String sname)
    {
        this.fname = fname;
        this.sname = sname;
    }
    
    public String getFname()
    {
        return fname;
    }
    
    public String getSname()
    {
        return sname;
    }
    
}


die Klasse TestVerwaltung: hier wird in den Vector vec eingefügt, und geordnet(was aber nicht funktioniert).

Code:
/*
 * TestVerwaltung.java
 *
 * Created on 12. August 2005, 17:20
 */

package Bsp_41_test;
import java.util.*;
/**
 *
 * @author  michi
 */
public class TestVerwaltung {
    Vector vec = new Vector();
    /** Creates a new instance of TestVerwaltung */
    public TestVerwaltung() {
    }
    
    
    public void add(Test ntest)
    {
        boolean eingefügt = false;
        String sname = ntest.getSname();
        Enumeration e = vec.elements();
        
        if(vec.isEmpty())
        {
            vec.addElement(ntest);
            return;
        }
        else
        {
           
            while(e.hasMoreElements())
            {
                Test test = (Test)e.nextElement();
                String namefromvector = test.getSname();
                
                if(sname.compareTo(namefromvector) < 0)
                {
                    vec.insertElementAt(ntest,  vec.indexOf(test));
                    eingefügt = true;
                    return;
                }
            }
            
            if(!eingefügt)
                vec.addElement(ntest);
        }
    }
    
    public String getAusgabe()
    {
        String ausgabe = "";
        Enumeration e = vec.elements();
        
        while(e.hasMoreElements())
        {
            Test next = (Test)e.nextElement();
            ausgabe = next.getFname() + " " + next.getSname() + "\n";
        }
        
        return ausgabe;
    }
    
}



die klasse TestView in gekürzter Fassung:


Code:
/*
 * TestView.java
 *
 * Created on 12. August 2005, 17:11
 */

package Bsp_41_test;

import javax.swing.*;

/**
 *
 * @author  michi
 */
public class TestView extends javax.swing.JFrame {
    TestVerwaltung test = new TestVerwaltung();
    private DefaultListModel dlm = new DefaultListModel();
    /** Creates new form TestView */
    public TestView() {
        initComponents();
        
        jList1.setModel(dlm);
    }

...........

   private void onEinfügen(java.awt.event.ActionEvent evt) {
     
     
     String fname = tfFname.getText();
     String sname = tfSname.getText();
     
     test.add(new Test(fname, sname));
     
     String ausgabe = test.getAusgabe();
     
     dlm.addElement(ausgabe);
    }

.........


ich bin drauf gekommen das er in der Klasse TestVerwaltung nicht in die while schleife: while(e.hasMoreElements) geht. ich verstehe aber nicht warum. das eigenartige ist auch das, die if abfrage if(vec.isEmpty()) immer true ist was heißen müsste das er die "Person" nicht einfügt. an dieser stelle bin ich auch mit meinem latein am ende.
ich hoffe ihr könnt mir helfen?

L-ectron-X hat den Titel angepasst.
 
1. gescheiten Titel
2. such nach Comparator, Comparable im Forum, da gibts min. 1000 Posts, in denen erklärt wird wie du genau DEIN problem lösen kannst
 
@KSG9|plak: Das kannst du doch schnell als Moderator selbst erledigen. Ich mache das am Tag sicher auch so 4-5 mal.

Um der Lösung des Problems hier noch beizutragen:
KSG9|plak hat's schon angedeutet. Deine Klasse Test muss das Interface Comparable implementieren und die Methode compareTo() überschreiben. Die Klasse String hat bereits die compareTo()-Methode ausprogrammiert, so dass wir nur noch die Referenzen auf die zu vergleichenden Objekte übergeben brauchen.
Code:
public int compareTo(Object o) {
  if(o instanceof Test) {
    Test test = (Test)o;
    int i = this.getSname().compareTo(test.getSname()); //Nachnamen vergleichen
    if( i == 0) { //wenn die Nachnamen gleich sind, auch den Vornamen vergleichen
      return this.getFname().compareTo(test.getFname()); {
    else {
      return i;
    }
  }
  return 0; //Objekte sind gleich
}
Deinen Vector sortierst du dann einfach mit:
Code:
Collections.sort(vec);
 
L-ectron-X hat gesagt.:
Code:
public int compareTo(Object o) {
  if(o instanceof Test) {
    (...)
  }
  return 0; //Objekte sind gleich
}
Per Definition muss Comparable.compareTo(Object) eine ClassCastException werfen, wenn mit dem übergebenen Objekt nicht verglichen werden kann. Außerdem würde ich String.CASE_INSENSITIVE_ORDER (direkt mit TreeSet) oder String.compareToIgnoreCase() verwenden, damit Namen wie "DiBona" und "Dibels" richtig sortiert werden.
 
Eine ClassCastException kann eigentlich nicht geworfen werden, denn das wird in der if-Bedingung gleich zu Beginn der Methode ausgeschlossen. Beim Rest hast du schon Recht. Das kann man machen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben