2017-10-18 80 views
0

我提出的Android應用程序的其他一個ArrayList的一部分。我試圖猜測用戶剛剛在木琴上演奏了哪首歌。我有:private List<String> mDespacito = new ArrayList<String>(Arrays.asList("f", "a","d","d"));private List<String> mPlayed = new ArrayList<String>();當用戶按下木琴一個關鍵,我加他壓到mPlayed ArrayList中的關鍵,是這樣的:Java是爲了

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 

而且我知道爲什麼:因爲if (mPlayed.containsAll(mDespacito))的只是檢查是否mDespacito的元素是mPlayed。但我需要檢查是否有mDespacito的所有元素(包括那些有兩次),如果他們在正確的順序。有沒有像我可以使用的命令?由於

+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.indexOfSubListhttps://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; 
} 

但請記住,如果你不使用原語或字符串尖端你需要在你的對象上實現hashCode和equals。

+0

嗯,沒有不行,太過。這次它甚至不顯示你只玩過despacito。我認爲這是因爲mPlayed不等於mDespacito,它只是包含mDespacito –

+0

添加代碼片段,看看它是否有效 –

0

list1.equals(list2)可用於

一個很不錯的解釋在下面的鏈接中給出。請找到。

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

+0

嗯,沒有不工作,也是。這次它甚至不顯示你只玩過despacito。我認爲這是因爲mPlayed不等於mDespacito,它只包含mDespacito –