Java 使用数组列表获取值的位置

Java Get the position of a value using an arraylist

我正在尝试从下面的字节数组消息中获取 STX (0x02) 的位置。如果您看到该消息,它在许多地方都有 0x2,但我唯一想要的位置是 STX 位置。我一直在使用 for 循环向后循环。顺便说一句,我必须向后循环。我尝试了多种方法,但我很难获得那个职位。我尝试过但没有奏效的一种方法是,无论 0x2 在哪里,并且在它和它前面的 ETX (0x3) 之间有 3 个或更多的元素,就可以获得该 STX 的那个位置。但是我做错了什么,因为我不断收到一个我难以解决的错误。你能帮忙吗?

编辑:如果有更好的方法那么我通过将它与其他 0x2 区分开来找到那个位置 (STX) 的逻辑,请你提供那个。

编辑:我必须向后循环,因为这是给我的说明所要求的。

编辑:这是代码:

    //Test 3:
    public String Test3(List<Byte> byteList) {
        //checking positions of the STX and ETX
        //looping through the array backwards
        for (int i = byteList.size() - 1; i >= 0; i--) {                
            if (byteList.get(i) == STX && (i >= 3 && byteList.get(i) == ETX)) {
                STXpos = i;
            }
        }       
        return STXpos;
    }
    byte[] validMsgWithRandomData = {0x32,0x32,0x32, //Random data
    0x02, // STX
    0x31,0x32,0x10,0x02,0x33, // Data 31 32 02 33
    0x03, // ETX
    0x31^0x32^0x02^0x33^0x03,// LRC calculated from the data (with the DLE removed) plus the ETX
    0x2,0x3,0x00,0x02 //Random data
};

由于STX和ETX之间的元素数量不是常数,所以我会按正常顺序搜索,找到STX后再寻找ETX:

public String Test3(List<Byte> byteList) {
    // find potential STX
    for (int i = 0; i < byteList.size(); ++i) {
        if (byteList.get(i) == STX) {
            // make sure matching ETX exists
            for (int j = i + 1; j < byteList.size(); ++j) {
                if (byteList.get(j) == ETX) {
                    return i;
                }
            }
        }
    }
}

如果确实需要,也可以倒序进行:

public String Test3(List<Byte> byteList) {
    // find potential ETX
    for (int i = byteList.size() - 1; i > 0; --i) {
        if (byteList.get(i) == ETX) {
            // make sure matching STX exists
            for (int j = i - 1; j > 0; --j) {
                if (byteList.get(j) == STX) {
                    return j;
                }
            }
        }
    }
}

顺便说一下,如果你想强制 STX 和 ETX 之间的元素距离,你可以通过更改 j 的初始化来实现。

我第一次尝试反向循环,复杂度为 O(n)。

编辑:删除 STX 候选对象。

编辑 2:此解决方案至少适用于少数情况,包括 OP 的情况(但尚未经过广泛测试...)。

    final int NOTFOUND = -1;
    final int ETX = 0x03;
    final int STX = 0x02;
    int stxpos = NOTFOUND;
    int etxpos = NOTFOUND;
    int etxcandidatepos = NOTFOUND;
    for (int i = validMsgWithRandomData.length - 1; i >=0; --i)
    {
        if (ETX == validMsgWithRandomData[i])
        {
            etxcandidatepos = i;
            if (NOTFOUND == etxpos)
            {
                etxpos = i;
                stxpos = NOTFOUND;
            }
        }
        else if (STX == validMsgWithRandomData[i])
        {
            if (NOTFOUND != etxpos)
            {
                stxpos = i;
                if (NOTFOUND != etxcandidatepos)
                {
                    etxpos = etxcandidatepos;
                    etxcandidatepos = NOTFOUND;
                }
            }
        }
    }