[英]Processing vector objects in java
我有一个对象向量,需要使用开始索引和结束索引进行处理。如果结束索引对于多对象是相同的,则我只需要保留较大的字符串name
,并且必须与开始索引相同,如下所示
vector =start:21 end:24 name:abc
start:22 end:24 name:bc
start:28 end:31 name:xyz
start:29 end:31 name:yz
start:30 end:31 name:z
start:45 end:51 name:robert
start:45 end:48 name:rob
我必须处理此向量并以以下方式打印。
vector =start:21 end:24 name:abc
start:28 end:31 name:xyz
start:45 end:51 name:robert
我已经尝试过以下内容
for(int i=0;i<vecotr.size();i++)
{
NameBuffer b=vecotr.get(i);
if(i+1<vecotr.size())
{
NameBuffer b1=vecotr.get(i+1);
if(b.end==b1.end )
{
if(b.name.length()>b1.name.length())
{
vector.remove(i+1);
}
}
if(b.begin==b1.begin )
{
if(b.name.length()>b1.name.length())
{
vector.remove(i+1);
}
}
}
}
NameBuffer构造函数:
public NameBuffer(String oneLine) {
try {
String[] parts = oneLine.split("\\s*\\|\\s*");
String tmp = parts[0].substring("start:".length());
this.begin = Integer.parseInt(tmp);
String tmp1 = parts[1].substring("end:".length());
this.end = Integer.parseInt(tmp1);
String tmp2 = parts[3].substring("name:".length());
this.name = tmp2;
} catch (NumberFormatException nfe) {
System.out.print("XML is not in a desired Format");
nfe.printStackTrace();
}
}
public String toString()
----------------
----------------
上面的代码示例并未删除具有相同结束索引或起始索引的所有条目,而是能够删除name:bc
和name:yz
但未删除name:z
在vector.remove(i+1);
加我- i--;
。
然后,在删除一个元素之后,如果它匹配后面的多个元素,它将再次检查该元素。
让我们检查以下序列部分:
[2]: start:28 end:31 name:xyz
[3]: start:29 end:31 name:yz
[4]: start:30 end:31 name:z
现在,如果i == 2
,则还要检查i + 1 == 3
,并删除索引3的元素。接下来,将i设置为3,这会将索引3( z
)的元素与索引4的元素进行比较。 ( robert
),并且由于开始和结束均不匹配,因此您无需删除。
您可以尝试通过向后移动来解决此问题,即从i = vector.size() - 2
到i = 0
,比较i
和i + 1
处的元素(由于从下一个最后一个元素开始而始终应存在) )。
这样,您将比较元素3和4并保留3( yz
)。 然后将i设置为2,然后比较元素2和3,然后再保留元素2( xyz
)。
如果最大的元素在序列的末尾,那没关系。 考虑一下:
[0]: a
[1]: ab
[2]: abc
您将首先将ab
和abc
与i进行比较,然后将i设为1。然后删除使abc
移至索引1的ab
。在下一次迭代中,我将i减为0,然后将a
和abc
进行比较,这次删除a
一次。
顺便说一句,如果两个元素具有相同的开始和结束索引,则您的代码可能会删除过多。 因此,请首先检查所有条件,如果其中任何匹配项仅被删除一次。
这是循环的适应版本:
for(int i = vector.size() - 2; i >= 0; i--)
{
// no need to check here, the loop ensures that i and i+1 are within the bounds
NameBuffer b=vector.get(i);
NameBuffer b1=vector.get(i+1);
if(b.end==b1.end || b.begin==b1.begin)
{
if(b.name.length()>b1.name.length())
{
vector.remove(i+1);
}
else
{
vector.remove(i);
}
}
}
另一个注意事项:考虑使用ArrayList
代替Vector
。
一个重要的注意事项 :这将要求您的向量/列表按开始索引和结束索引排序,因此请确保先进行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.