我有一个主要的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;
}
}
}
}
答案 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());