验证来自两个arraylist的数据并将其删除

时间:2017-10-16 06:39:09

标签: java arraylist

我有一个主要的arraylist调用toBeDeleted,它存储了时间戳和电子邮件。以下是toBeDeleted arraylist

中的示例数据
var check1, check2;

$("#btn-1").click(function() {
    check1 = 1;
    if (check1 == 1 && check2 == 1)
        $("#btn-3").removeClass("none");
});

$("#btn-2").click(function() {
    check2 = 1;
    if (check1 == 1 && check2 == 1)
        $("#btn-3").removeClass("none");
});

我有一个arraylist调用logData1,它存储状态,电子邮件,时间戳和ID。以下是logData1 arraylist中的示例数据。

[1507075234, bunny@outlook.com]

我希望通过首先使用toBeDeleted1 arraylist中所述的时间戳验证时间戳来删除logData1 arraylist中的数据,如果时间戳匹配,我将检查两个arraylist的电子邮件。如果它们都匹配,我想删除所有数据(状态,电子邮件,时间戳,ID)。但我不能让它发挥作用

这是我源代码的示例输出

[16, bunny@outlook, 1507075234, 0OX9VQB-01-00P-02]



这是我的示例程序

[16, bunny@outlook.com, 1507075234, 0OX9VQB-01-00P-02]
The data inside toBeDeleted1 is :[1507075234, bunny@outlook.com]
The time1 is :1507075234
The email1 is :bunny@outlook.com
The time is :1507075234
The emails is :bunny@outlook.com
The data is :bunny@outlook.com
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -3
    at java.util.ArrayList.elementData(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at EmailReporting.main(EmailReporting.java:83)



执行此代码行后发生错误

   System.out.println(logData1);
   System.out.println("The data inside toBeDeleted1 is :"+toBeDeleted1);
         for(int v = 0;v<toBeDeleted1.size();v++)  //look through the logdata1 for removing the record base on timestamp 
         {
           String time1 = toBeDeleted1.get(v);
           String email1 = toBeDeleted1.get(v+1);
           System.out.println("The time1 is :"+time1);
           System.out.println("The email1 is :"+email1);
           for(int f = logData1.size();f>logData1.size()-1;f--)
           {
            //   System.out.println(logData1.size());
            //   System.out.println("The data in logdata1 is "+logData1.get(f-2));
               if(time1.equals(logData1.get(f-2)))
               {
                   System.out.println("The time is :"+logData1.get(f-2));
                 System.out.println("The emails is :"+logData1.get(f-3));
                   if(email1.equals(logData1.get(f-3)))
                   {
                     System.out.println("The data is :"+logData1.get(f-3));
                       logData1.remove(f-1);
                       logData1.remove(f-2);
                       logData1.remove(f-3);
                       logData1.remove(f-4);
                       f-=4;   
                   }

               }
           }
         }

1 个答案:

答案 0 :(得分:1)

您可以使用Collections.indexOfSubList

按顺序查找列表中的元素
List<String> toFind = Arrays.asList(time1, email1);
int emailIndex = Collections.indexOfSubList(logData1, toFind);

也存在类似的lastIndexOfSubList方法。这可能更适合您的用例。

然后,您可以使用此功能从toFind中删除元素:

int emailIndex = Collections.lastIndexOfSubList(logData1, toFind);
if (emailIndex >= 1) {
  logData1.subList(emailIndex-1, emailIndex+3).clear();
}

只需在循环中执行此操作即可继续操作,直到所有事件都被删除。

请注意,只是在循环中执行此操作将继续反复搜索列表的尾部。相反,您可以使用subList来&#34;剁&#34;列表的末尾,以避免重新搜索它:

List<String> view = logData1;
int emailIndex;
while ((emailIndex = Collections.lastIndexOfSubList(view, toFind)) >= 1) {
  logData1.subList(emailIndex-1, emailIndex+3).clear();
  view = logData1.subList(0, emailIndex-1);
}

此外,请注意,从ArrayList的中间删除效率很低,因为删除后的元素必须向下移动。这就是使用subList(...).clear() 更好的原因,因为它会立即执行所有这些转换。但是如果你要删除大量的4元素批次,你可以做得更好。

您可以将要删除的元素位设置为subList(...).clear()而不是BitSet

List<String> view = logData1;
BitSet bits = new BitSet(logData1.size());
int emailIndex;
while ((emailIndex = Collections.lastIndexOfSubList(view, toFind)) >= 1) {
  bits.set(emailIndex-1, emailIndex+3);
  view = logData1.subList(0, emailIndex-1);
}

然后立即将所有元素向下移动,丢弃要删除的元素:

int dst = 0;
for (int src = 0; src < logData1.size(); ++src) {
  if (!bits.get(src)) {
    logData1.set(dst++, logData1.get(src));
  }
}

现在截断列表:

logData1.subList(dst, logData1.size());