2

これが私のクラスに使用しているコードです。私はそれを何度もテストしましたが、シリアライズとデシリアライズを行わなければ、関数はすべて正しく動作します。

public class Library {

    private String libTitle;
    private Vector<Album> albums;

    public String getLibTitle() {
        return libTitle;
    }

    public void setLibTitle(String libTitle) {
        this.libTitle = libTitle;
}

public Vector<Album> getAlbums() {
    return albums;
}

public void setAlbums(Vector<Album> albums) {
    this.albums = albums;
}

public Library(){
}

public Library(String libTitle) {
    this.libTitle = libTitle;
    this.albums = new Vector<Album>();
    albums.trimToSize();

}


public void addAlbum(String album){
    boolean added = false;
    for (Album alb: this.getAlbums()){
        if (alb.getAlbum()==album){
            added=true;
        }
        if (added){
            break;
        }
    }
    if (!added){
        this.getAlbums().add(new Album(album));
        this.getAlbums().trimToSize();
    }
}

public void removeAlbum(String album){
    for (Album alb : this.getAlbums()){
        if (alb.getAlbum()==album){
            this.getAlbums().remove(alb);
            this.getAlbums().trimToSize();
            break;
        }
    }
}

public void addSong(String title, String author, String album){
    boolean added = false;
    for (Album alb : this.getAlbums()){
        if (alb.getAlbum()==album){
            alb.addSong(title,author);
            added=true;
        }
        if (added){
            break;
        }
    }
    if (!added){
        this.addAlbum(album);
        this.addSong(title, author, album);
    }
}

public void removeSong(String title, String author, String album){
    boolean removed = false;
    for (Album alb : this.getAlbums()){
        if (alb.getAlbum()==album){
            alb.removeSong(title);
            if(alb.getSongs().isEmpty()){
                this.getAlbums().remove(alb);
                this.getAlbums().trimToSize();
            };
            removed=true;
        }
        if (removed){
            break;
        }
    }       
}

public void save()
{
    try {
        FileOutputStream xmlos = new FileOutputStream(this.libTitle +".xml");
            XMLEncoder encoder = new XMLEncoder(xmlos);
        encoder.writeObject(this);
        encoder.close();
        xmlos.close();
        System.out.println("Done exporting a user as xml to "+this.libTitle+".xml");
    }catch(Exception e) {
        e.printStackTrace();
    }
}

public Library restore(String lib)
{
    Library newLib = null;
    try {
        System.out.println("Importing a user as xml from "+lib+".xml");
        FileInputStream inFileStream = new FileInputStream(lib +".xml");
        XMLDecoder decoder = new XMLDecoder(inFileStream);
        newLib = (Library)decoder.readObject();
        decoder.close();
        inFileStream.close();
        System.out.println("Libloaded "+ newLib.getLibTitle());
        return newLib;

    }catch(Exception e) {
        e.printStackTrace();
    }
    return newLib;

}

}

次はライブラリで使用するアルバムクラス Class

public class Album {

private String album;
private Vector<Song> songs;

public Vector<Song> getSongs() {
    return songs;
}

public void setSongs(Vector<Song> songs) {
    this.songs = songs;
}

public Album(){
}

public Album(String album) {
    this.album = album;
    this.songs = new Vector<Song>();
    songs.trimToSize();

}

public String getAlbum() {
    return album;
}

public void setAlbum(String album) {
    this.album = album;
}

public void addSong(String song, String author){
    boolean added = false;
    for (Song son : this.getSongs()){
        if (son.getTitle()==song){
            added=true;
        }
        if (added){
            break;
        }
    }
    if (!added){
        this.getSongs().add(new Song(song, author));
        this.getSongs().trimToSize();
    }
}

public void removeSong(String song){
    for (Song son : this.getSongs()){
        if (son.getTitle()==song){
            this.getSongs().remove(son);
            this.getSongs().trimToSize();
            break;
        }
    }

}

}

その後は歌のクラスです。

public class Song {

private String title,author;

public Song(){
}

public Song(String title, String author) {
    this.title = title;
    this.author = author;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}
}

したがって、基本的には、XMLにシリアライズしてから、作成中のアプリ用にデシリアライズするライブラリです。私の問題は、次のコードを実行するときです.....

public class Run {


public static void main(String args[]){
    Library lib = new Library("MYLibrary");
    lib.addSong("Crawling", "Lincoln Park", "Hybrid Theory");
    lib.addSong("In The End", "Lincoln Park", "Hybrid Theory");
    lib.addSong("Fire", "Pyros", "Burning Up");
    lib.addSong("Ocean", "Drowners", "Burning Up");
    lib.save();
    Library lib2 = new Library();
    lib2 =lib2.restore("MYLibrary");
    lib2.setLibTitle("test");
    lib2.removeSong("In The End", "Lincoln Park", "Hybrid Theory");
    lib2.addSong("Crawling in the dark", "me", "Hybrid Theory");
    lib2.removeSong("Crawling in the dark", "me", "Hybrid Theory");
    lib2.removeSong("Ocean", "Drowners", "Burning Up");
    lib2.removeAlbum("Hybrid Theory");
    lib2.save();

}

}

作成された両方の XML ファイルが同じである必要があるように、保存された XML ファイルには 1 つの曲が含まれているわけではありません。なぜ機能しないのか、先生も私も理解できませんでした。

4

2 に答える 2

3

==notを使用してアルバムと曲のタイトルを比較してい.equals()ます。オブジェクト参照が変更されるため、オブジェクトがシリアル化および逆シリアル化されている場合、これは機能しません。

より一般的には、ほとんどの場合、文字列を.equals()notと比較する必要があります。==例えば:

new String("test") == "test"

に評価されfalseます。詳細については、この質問を参照してください。

Album クラスと Song クラスが.equals()andhashcode()メソッドをオーバーライドすると、タイトルを抽出して比較するのではなく、直接比較できるようになるとよいでしょう。

于 2012-10-03T21:58:47.177 に答える
0

文字列比較を持つすべてのメソッドは==、代わりに を使用していequals()ます。==演算子は、オブジェクト インスタンスを比較します。2 つのオブジェクト インスタンスは同じではないためfalse、すべてのケースで返されます。正しい比較方法を使用するようにメソッドを更新します。たとえば、removeAlbum メソッドを次のように更新する必要があります。

public void removeAlbum(String album) {
    for (Album alb : this.getAlbums()) {
        if (alb.getAlbum().equals(album)) {
            this.getAlbums().remove(alb);
            this.getAlbums().trimToSize();
            break;
        }
    }
}

equalsまた、クラス定義にメソッドを実装(オーバーライド)することをお勧めします。これは、クラスにさらに属性を追加するときに役立ちます。

于 2012-10-03T22:43:43.133 に答える