将一系列列表转换为子列表,并将它们存储在类型linkedlist的列表中

时间:2015-10-17 03:00:15

标签: java arrays data-structures linked-list

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

$result = mysql_query("SELECT * FROM users WHERE email = '$email' AND 
password ='$password' LIMIT 1");

if(mysql_num_rows($result) > 0){
  $row = mysql_fetch_array($result, MYSQL_ASSOC);
  $firstname = $row["firstname"];
  echo "<BR>Login Successful, welcome";
  echo $firstname;
}else{   
  echo 'wrong password/username combo';
}

但是,当我在arrayA中调用方法清除时,此代码失败,那么无论使用何种数据结构,是否有使用此逻辑的代码的替代方法?

3 个答案:

答案 0 :(得分: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
        }
    }
}

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

问题在于,当您将链接列表添加到最终存储p时,您假设列表的元素已放入其中。只引用了一个指针,所以当你清除下一行时,所有的元素都消失了。

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

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

重用
arrayA = new LinkedList<Integer>();

当这样做时,您没有丢失旧列表,因为p正在保留对它的引用。

另一个提示是使用有意义的名称命名列表。

originalIntList,groupedIntList,singleGroupIntList帮助读者弄清楚他们可以做的更多,而不是注释说明Java对象的明显方面。