Java是按顺序排列的数组列表的一部分



我正在为安卓制作一个应用程序。我试图猜测用户刚刚在木琴上播放的歌曲。我有:private List<String> mDespacito = new ArrayList<String>(Arrays.asList("f", "a","d","d"));private List<String> mPlayed = new ArrayList<String>();当用户按下木琴上的一个键时,我将他按下的键添加到 mPlay 数组列表中,如下所示:

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的所有元素(包括那些存在两次的元素)以及它们是否顺序正确。有没有我可以使用的命令?谢谢

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

使用

mPlayed.equals(mDespacito);

相反,将按顺序和元素检查元素。

重要说明:如果您没有按照代码演示使用字符串,则需要在添加到列表中的类中实现 hashCode 和 equals。

以下代码片段导致显示 true 两次,然后显示 false

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;
 }

但请记住提示,如果您不使用原语或字符串,则需要在对象上实现哈希代码和等于。

可以使用

list1.equals(list2)

下面的链接给出了一个非常好的解释。请找到。

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

最新更新