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;
}
}
}
}
我正在尝试从下面的字节数组消息中获取 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;
}
}
}
}