繁体   English   中英

用Java处理矢量对象

[英]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:bcname: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() - 2i = 0 ,比较ii + 1处的元素(由于从下一个最后一个元素开始而始终应存在) )。

这样,您将比较元素3和4并保留3( yz )。 然后将i设置为2,然后比较元素2和3,然后再保留元素2( xyz )。

如果最大的元素在序列的末尾,那没关系。 考虑一下:

[0]: a
[1]: ab
[2]: abc

您将首先将ababc与i进行比较,然后将i设为1。然后删除使abc移至索引1的ab 。在下一次迭代中,我将i减为0,然后将aabc进行比较,这次删除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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM