2015-10-17 190 views
0

我已经有一个列表类型整数值,并且我想从索引零开始顺序测试,如果一个元素范围的总和满足特定值,然后将该范围复制到列表中并将其存储在链表列表中。然后再次依次测试,但是现在从前一个范围的下一个索引开始测试,所以如果前一个范围是索引0到索引9,则从索引10开始,然后重复该过程直到最后一个索引。将一系列列表转换为子列表,并将它们存储在一个链表类型列表中

List<Integer> arrayB = new LinkedList<Integer>(); //this is the array with values in it 

List<LinkedList> p = new LinkedList<LinkedList>();// this is the array of arrays 

List<Integer> arrayA = new LinkedList<Integer>();// this is the range or the sub list of arrayB 

public void function(int n)// suppose that n = 6 and arrayB have these value {1,2,3,1,1,1,1,2} 
{ 
    int count = 0; 

    for (int w : arrayB) 
    { 
     count = w + count; 
     arrayA.add(w); 
     if(count == n) 
     { 
      count = 0; 
      p.add((LinkedList) arrayA); 
      arrayA.clear(); 
     } 
    } 
} 

然而,当我调用方法中arrayA清除此代码失败,因此没有任何替代使用具有这种逻辑而不管该数据结构的代码?

+0

这是一个非常长的第一句话。你在“如果一个范围的总和......”中失去了我们。 – ergonaut

+0

你甚至更早失去了我。关于何时开始调用“LinkedList”和数组数组。在Java中,数组与列表有不同的类型。如果你将一个“列表”称为“数组”,反之亦然,结果将会是我们在“数组”是指Java数组还是Java“List”时计算出来的。 –

+0

@ergonaut我编辑了这篇文章,它是一个元素范围的总和,如果你看到代码,例如arrayB中的元素具有{1,2,3,1,1,1,1,2}元素,所以前3个元素的总和为6,满足条件(count == n),因此范围将是索引0到索引2。 – Andres

回答

0

您每次向p添加子列表时都使用相同的列表引用arrayA,p中的每个列表元素都指向相同的arrayA。所以当你调用arrayA.clear();您清除p中的所有列表元素。

要纠正这一点,你需要创建一个新的列表对象当您添加一个子表到arrayA:

public static void function(int n)// suppose that n = 6 and arrayB have these value {1,2,3,1,1,1,1,2} 
{ 
    int count = 0; 

    LinkedList<Integer> subList = new LinkedList<>(); 
    for (int w : arrayB) { 
     count = w + count; 
     subList.add(w); 
     if (count == n) { 
      count = 0; 
      p.add((LinkedList) subList); // p is adding a new list reference every time 
      subList = new LinkedList<>(); // create a new list object, subList points to a new list object 
     } 
    } 
} 
+0

这是我希望它的工作完全正常的答案,我不得不改变一行代码谢谢。 – Andres

0

我对这个问题的理解是这样的: 存在从您想一个数组在满足某些标准的情况下提取一定范围的值。在这种情况下,标准是范围评估为某个总和。完成此操作后,您希望重复该过程,直到原始数据结构中的所有值都已用尽。 我会假设你的原始数据结构是一个整数数组,并且你的结果数据结构是整数数组的链表。

一种方式做到这一点可能是保持全局计数器,用于跟踪原始数组的当前索引,如像下面这样:

int[] originalArray = {//list of numbers separated by commas}; 
LinkedList<Integer[]> resultingList = new LinkedList<>(); 
int currentIndex = 0; 

public static void function(int totalSum) { 
    int currentSum = 0; 
    int initialIndex = currentIndex; 
    while((currentSum != totalSum) && (currentIndex < (originalArray.length - 1))) { 
     if(currentSum + initialArray[currentIndex] <= totalSum) { 
      currentSum += initialArray[currentIndex]; 
      currentIndex++; 
     } 
     else { 
      break; 
     } 
    } 
    if(currentSum = totalSum) { 
     int[] arrayToAdd = new int[currentIndex - initialIndex - 1]; 
     for(int i = 0; i < currentIndex - initialIndex; i++) { 
      arrayToAdd[i] = originalArray[initialIndex + i]; 
     } 
     resultingList.add(arrayToAdd); 
    } 
} 
+0

其实前面的代码的问题是我删除了数组p的元素指向的arrayA对象的引用,所以解决方案只是再次初始化数组而不是调用方法清除 – Andres

+0

好吧,很好,你知道了! –

0

的问题是,当您添加链表插入最终存储器p中,则假定列表中的元素放在那里。只有一个指针被引用,所以当你清除它的下一行时,所有的元素都消失了。

p.add((LinkedList) arrayA); 
arrayA.clear(); 

一个技巧是将arrayA的范围移动到函数内部。这是因为它是临时的,只有一个子列表,所以它不应该在实例级别。它可以通过做

arrayA = new LinkedList<Integer>(); 

重复使用,这样做的时候,因为p被保持对它的引用您还没有失去旧列表。

另一个技巧是使用有意义的名称命名您的列表。

originalIntList,groupedIntList,singleGroupIntList帮助读者弄清楚他们可能做的不仅仅是评论,说明Java对象的明显方面。

+0

是的,这是代码的问题,修复非常简单,下次我会考虑为代码编写有意义的名称 – Andres

相关问题