0

抽象クラスMidiMessageには、 MetaMessage 、 ShortMessageSysexMessageの 3 つのサブクラスがあります。shortmessages または sysexmessages のいずれかを送信する MidiDevice をリッスンしています。問題は、MidiMessage のハッシュコードが決して同じではないことです。したがって、MidiMessage 間の唯一の違いは、データのバイト配列です。

私の現在の解決策は、バイトを文字列に格納し、ハッシュマップに文字列が含まれているかどうかを確認することです。

public class Test{
    private String inputKey="";
    private byte[] data;
    private int isShortMessage;

    //...

    private void setInputKey(MidiMessage msg){
        inputKey="";
        data=msg.getMessage();
        if(msg instanceof ShortMessage){
            inputKey+= ((ShortMessage) msg).getChannel();   
            //last byte contains the value. Value isn't needed. 
            isShortMessage=1;
        }
        else isShortMessage=0;
        for(int i=0; i<msg.getLength()-isShortMessage;i++){
            inputKey+= data[i]; 
        }
   }
} 

しかし、キャストのオーバーヘッド (常に最後のバイトを切り取っていれば、それを取り除くことができます。これはほとんど常に機能するはずです...) と文字列変換のため、私はそれが好きではありません。では、ハッシュマップまたはコレクションに midimessage が含まれているかどうかを確認するより良い方法はありますか?

4

1 に答える 1

0

私が使用します:

Arrays.hashCode(byte[] a)

于 2013-10-21T18:21:08.440 に答える