2017-10-18 4 views
0

私はアンドロイド向けのアプリを作っています。私はユーザーがちょうど木琴で演奏した曲を推測しようとしています。私が持っている:private List<String> mDespacito = new ArrayList<String>(Arrays.asList("f", "a","d","d"));private List<String> mPlayed = new ArrayList<String>();ユーザーは木琴の一つのキーを押すと、私はこのように、彼はmPlayedのArrayListに押されたキーを追加します。今すぐJava 1人のarraylistが別のものの一部になっています

public void playD(View v){ 
    Log.d("Xylophone", "Played D!"); 
    mSoundPool.play(mDSoundId,LEFT_VOLUME,RIGHT_VOLUME,PRIORITY,NO_LOOP,NORMAL_PLAY_RATE); 
    mPlayed.add("d"); 
    CheckForSong(); 

}

、CheckForSongが含まれています

public void CheckForSong(){ 
    if (mPlayed.containsAll(mDespacito)){ 
     Log.d("Xylophone","You just played despacito"); 
     mPlayed.removeAll(mDespacito); 
    } 
} 

played F 
played A 
played D 
played D 
You just played despacito 

をしかし、それはありません:

だから、それは実行する必要があります。

played F 
played A 
played D 
You just played despacito 
played D 

そして、あなたも行うことができます。

played F 
played G 
played A 
played G 
played D 
You just played despacito 

をなぜ私が知っている:mDespacitoの要素がmPlayedである場合にだけチェックするためif (mPlayed.containsAll(mDespacito))の。しかし、私はmDespacitoのすべての要素が含まれているかどうか(2回あるものを含む)が正しい順序であるかどうかを確認する必要があります。私が使用できるようなコマンドはありますか?おかげ

+1

'Collections.indexOfSubList'はあなたを助けるかもしれません! –

+0

個々のノートを文字列に連結して文字列にすると、その順序を考慮した 'String.contains()'を使うことができます。 –

答えて

1

Collections.indexOfSubList答えです。私はこのようにそれを使用します。

public void CheckForSong(){ 
    int contains = Collections.indexOfSubList(mPlayed, mDespacito); 
    if (contains != -1){ 
     Log.d("Xylophone","You just played despacito"); 
     mPlayed.removeAll(mDespacito); 
    } 
} 

よりCollections.indexOfSubListについて: https://www.tutorialspoint.com/java/util/collections_indexofsublist.htm

1

使用

mPlayed.equals(mDespacito); 

代わりに、その要素は順序や要素にチェックされます。

重要:コードデモンストレーションで文字列を使用しない場合は、リストに追加するクラスにhashCodeとequalsを実装する必要があります。

エルス

import java.util.ArrayList; 

public class MyClass { 
    public static void main(String args[]) { 
     ArrayList<String> a = new ArrayList(); 
     a.add("f"); 
     a.add("a"); 
     a.add("d"); 
     a.add("d"); 

     ArrayList<String> b = new ArrayList(); 
     b.add("f"); 
     b.add("a"); 
     b.add("d"); 
     b.add("d"); 

     System.out.println(a.equals(b)); 
     System.out.println(b.equals(a)); 
     b.add("c"); 
     System.out.println(a.equals(b)); 
    } 
} 

偽二回そして真の表示で、次のスニペットの結果は:

public boolean equals(List f, List s) { 
     if(f.size() != s.size()) 
     return false; 
     for(int i = 0; i < f.size(); i++) 
      if(!f.get(i).equals(s.get(i)) 
      return false; 
} 

をしかし、あなたはプリミティブまたはStringを使用していない場合は、その先端を覚えている:あなたは、リストを自分で比較することができますあなたのオブジェクトにhashCodeとequalsを実装する必要があります。

+0

うーん、それもうまくいきません。今度はそれはあなたがちょうどdespacitoを演奏したことを示していません。私はそれがmPlayedがmDespacitoと等しくないためだと思う、それだけでmDespacitoを含む –

+0

それが動作することを確認するためにスニペットが追加されました –

0

list1.equals(list2)は非常にいい説明は以下のリンクに記載されている

を使用することができます。見つけてください。

https://stackoverflow.com/a/1075699/4994582

+0

うーん、それも動作しません。今度はそれはあなたがちょうどdespacitoを演奏したことを示していません。私はそれがmPlayedがmDespacitoに等しくないためだと思う、それはmDespacitoを含んでいるだけだ –

関連する問題