2011-08-07 8 views
0

私は、いくつかの曲オブジェクトを含むArrayListを持っています。キャストとArrayList

ArrayList<Song> aSong = new ArrayList<Song>(); 

ソングクラスは次のようになります。

public class Song { 
private String sName; 
private String sLength; 

public Song(String name, String length){ 
    sName = name; 
    sLength= length; 

} 

public String getName(){ 
    return sName; 

} 

public String getLength(){ 

    return sLength; 
} 


public void edit(String name, String length){ 
    sName = name; 
    sLength= length; 
} 

}

私は歌がArrayListの方法で存在しているかどうかを確認しようとしている

// example 
    aSong.contains("Song 1") 

"が含まれています"これは実際にはArrayListに存在していてもfalseを返します。

ご協力いただきまして誠にありがとうございます。ありがとうございます。

答えて

4

いいえ、"Song 1"は間違いArrayListには存在しません - それは文字列、ないSongだからです。

3つのオプション:それはその名前を持っているかどうかを確認するには、リスト内の各曲の

  • チェック。これはかなり簡単ですが、複数の場所でその機能が必要な場合は、別の方法で抽出する必要があります。ような何か:曲の名前に基づいてSong

    public static Song findSongByName(Iterable<? extends Song> songList, 
                String name) 
    { 
        // TODO: Nullity checks 
        for (Song song : songList) 
        { 
         if (song.getName().equals(name)) 
         { 
          return song; 
         } 
        } 
        return null; 
    } 
    
  • オーバーライドequals、そしてaSong.contains(new Song("Song 1")を呼び出します。これはおそらくSongの名前が同じで長さの違うオブジェクトが2つあるとすれば、等価と見なしたくないと思うので、良い考えです。です。

  • Map<String, Song>をビルドして、名前に基づいてリスト内の曲を検索できます。同じリストから複数の曲を検索する必要がある場合は、これが良い考えです。
+0

なぜOPはの大きさを決定するためにチェックして追加する必要がありますPredicateがある

public static <A> A find(final Iterable<A> iterable, final Predicate<A> predicate) { for(final A item : iterable) { if(predicate.isSatisfiedBy(item)) { return item; } } return null; } 

この特定の線形変換の下でベクトルが0ベクトルになる部分空間 – dlev

+0

@dlev(*ジョンスキートは、線形代数のジョークに*感謝したいと考えている):確かにそのコメントを書くとき、私の心に来た最初の* *ものではありません... –

+0

はジョンスキートありがとうございます。本当に助けに感謝します。神様があなたを祝福しました – Farax

1

「曲1」は文字列であり、どの曲オブジェクトとも同じではありません。 正確に正確にはあなたが望むことを理解するのではなく、言語があなたが望むものを推測することができる段階にいると聞こえます。

forループを作成してリストを1つずつ探して、正しいタイトルを探すことができます。または、あなたはHashMap<String, Song>を使用するように切り替える必要があります。そうすれば、タイトルで曲を探すことができます。

0

与えられた述語を満たす最初のオブジェクトを検索して返す関数findを定義することができます。

interface Predicate<A> { 
    boolean isSatisfiedBy(final A a); 
} 

下図のようにあなたがあなたの目的のために、この機能を使用することができます::

final Song song = find(songs, 
    new Predicate<Song>() { 
    boolean isSatisfiedBy(final Song s) { 
     return s.getName().equals("Song 1"); 
    } 
    } 
); 
関連する問題