Java ArrayList remove()意外结果?
这是我的密码Java ArrayList remove()意外结果?,java,Java,这是我的密码 void reduce() { KeyVal reducer1 = new KeyVal(); for (int i=0; i< m1.size(); i++) { reducer1.setKey(m1.get(i).getKey()); reducer1.setValue(m1.get(i).getValue()); for (int j=i+1; j < m1.size(); j++) {
void reduce() {
KeyVal reducer1 = new KeyVal();
for (int i=0; i< m1.size(); i++) {
reducer1.setKey(m1.get(i).getKey());
reducer1.setValue(m1.get(i).getValue());
for (int j=i+1; j < m1.size(); j++) {
if (m1.get(i).getKey().compareTo(m1.get(j).getKey()) == 0) {
m1.remove(j);
//System.out.println(i + "-->" + j);
reducer1.setValue(reducer1.getValue() + 1);
}
}
System.out.println(reducer1.getKey());
System.out.println(reducer1.getValue());
//r1.add(reducer1);
}
我越来越
3494702579
2
3494702579
1
但我应该
3494702579
3
我做错了什么?在迭代m1时,您正在从m1中删除元素。这会导致内部循环跳过某些元素。发生这种情况的原因是,在删除
j
-th元素后,仍在增加j
在您的示例中,3494702579
中的一个被跳过,并由外部循环的第二次迭代拾取
方法的整个逻辑可以使用键到计数的
映射和对输入列表的单次传递来重写。在迭代过程中从m1
中删除元素。这会导致内部循环跳过某些元素。发生这种情况的原因是,在删除j
-th元素后,仍在增加j
在您的示例中,3494702579
中的一个被跳过,并由外部循环的第二次迭代拾取
方法的整个逻辑可以通过使用键到计数的映射和对输入列表的单次传递来重写。在内部循环中,当删除一个元素然后递增j
时,实际上可能会跳过一个元素
但一般来说,一个更好的方法就是使用多集合的HashMap实现。
您当前的解决方案是O(n^2)
,而HashMap-one非常接近O(n)
void reduce(){
HashMap reducer1=新的HashMap();
对于(int i=0;i
在您的内部循环中,当您删除一个元素,然后递增j
时,实际上您可能会跳过一个元素
但一般来说,一个更好的方法就是使用多集合的HashMap实现。
您当前的解决方案是O(n^2)
,而HashMap-one非常接近O(n)
void reduce(){
HashMap reducer1=新的HashMap();
对于(int i=0;i
3494702579
3
void reduce() {
HashMap<xxx, Integer> reducer1 = new HashMap<xxx, Integer>();
for (int i=0; i< m1.size(); i++) {
xxx key = m1.get(i).getKey();
int count = 0;
if ( reducer1.containsKey(key) ) count = reducer1.get(key);
reducer1.put(key, count+1);
}
//print the values
}