Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环以命中数组的每个元素?_Java - Fatal编程技术网

Java 循环以命中数组的每个元素?

Java 循环以命中数组的每个元素?,java,Java,好吧,那么。。。我需要检查数组是否是完整的链。我将向您展示这意味着什么: 我有arr[5,3,2,0,4,1]。N(数组大小)=6,N-1=5。所以数组应该包含数字0-5。然后我们从arr[0]开始 arr[0]=5,所以我们转到arr[5]=1,arr[1]=3,arr[3]=0,这使我们回到了arr[0] 由于此数组没有指向每个数字,因此它不是一个完整的链。我希望这是有意义的,哈哈 我应该用java编写一个方法,它从arr[0]开始,按照我说的那样执行,如果它命中数组中的每个数字,它就是完整

好吧,那么。。。我需要检查数组是否是完整的链。我将向您展示这意味着什么:

我有arr[5,3,2,0,4,1]。N(数组大小)=6,N-1=5。所以数组应该包含数字0-5。然后我们从arr[0]开始

arr[0]=5,所以我们转到arr[5]=1,arr[1]=3,arr[3]=0,这使我们回到了arr[0]

由于此数组没有指向每个数字,因此它不是一个完整的链。我希望这是有意义的,哈哈

我应该用java编写一个方法,它从arr[0]开始,按照我说的那样执行,如果它命中数组中的每个数字,它就是完整链(true)。如果它返回到它已经命中的数字,则它不是(false)

我理解这背后的逻辑。。。我就是不能实现它。我不知道如何使用循环来跟踪数字和索引。。。(我们应该使用循环)


有人能帮我指出正确的方向吗?我不是在寻找代码,但如果有人能解释我如何用它实现一个循环,那就太棒了

可以使用for循环在数组中进行迭代。 以下是一个例子:

int[] array = new int[4];
array[0] = 2;
array[1] = 5;
array[2] = 1;
array[3] = 8;

for(int i = 0; i<array.length; i++){
    System.out.println("The element in the array at position: "+ i +" is: " + array[i]);
}
int[]数组=新的int[4];
数组[0]=2;
数组[1]=5;
数组[2]=1;
数组[3]=8;

对于(int i=0;i我将描述一个方法,该方法在给定int数组的情况下返回所提供索引位置的值

public static int getAtPosition(int nextPosition, int... elements) {
    return elements[nextPosition];
}
本质上,我为
nextPosition
使用的任何值都用于索引到数组中

考虑下一步,您正在使用
arr[0]
开始播种您的
nextPosition
,如果与方法调用结合使用,将导致下一个位置值
1

您还可以正确地观察到它的振荡,这使它成为无效链

现在,这里的技巧是选择一个数据结构来存储我们看到的元素,并防止我们再次触发重复。让我们使用
Set
来实现这一点,因为我们可以相对便宜地
add
,并且
Set
的接口要求它返回
true
当且仅当此元素在此之前,未向集合中添加元素

public static boolean invalidChain(Set<Integer> values, int index) {
    return !values.add(index);
}
publicstaticbooleanivalidchain(设置值,int索引){
返回!值。添加(索引);
}
解释:

  • 给定一组整数,我添加刚才看到的索引位置
  • 如果成功添加索引位置,我将返回false-因为成功的
    add()
    意味着该值从未放入集合中
  • 如果未成功添加索引位置,我将返回true-原因与上述相反

考虑到所有这些,您现在必须编写一个循环,利用布尔值
invalidChain
,以及int
getAtPosition
。提示:
invalidChain
是您应该在循环中检查的唯一条件。

您想要一个计数器(初始化为0)用于链外的元素。您还需要与数组大小相同的布尔型数组。此布尔型数组用于跟踪是否有重复的元素

为了使程序更快,在for循环(用于迭代数组)中,当您发现一个元素不在链范围内时,您可以增加计数器并跳出循环。之后,您只需检查计数器==0。如果是0,则链是完整的,否则是不完整的。我希望这会有所帮助

如何检查元素是否超出范围?检查元素是否>=array.length或<0(如果我正确理解您的问题)

我意识到你可能正在做家庭作业或类似的事情,我把大部分代码留给你自己去做。下面是我将如何使用布尔类型的数组来跟踪元素:

int[] arrayToCheck = new int[]{5, 3, 2, 0, 1, 1};
boolean[] arrayMarker = new boolean[arrayToCheck.length];

int count = 0;  // count the number out of the chain

for (int i : arrayToCheck) {
    // here you need to write code to check the element i is within
    // your range, if not, increment counter, break out

    if (arrayMarker[i] != true) {
        arrayMarker[i] = true;
    } else {
        count++;
        break;
    }
}

boolean completeChain = (count == 0) ? true : false;
System.out.println("is completeChain: " + completeChain);

假设数字是唯一的:

public int sum(int[] arr) {
    int ret = 0;
    for (int i : arr) {
        ret += arr[i];
    }
    return ret;
}

int[] arr = { 5, 3, 2, 0, 4, 1 };
int tmp = arr[0];
int sum = 0;
for (int i = 0; i < arr.length; i++) {
    sum += arr[tmp];
    tmp = arr[tmp];
}
System.out.println(sum == sum(arr));
public int sum(int[]arr){
int-ret=0;
用于(int i:arr){
ret+=arr[i];
}
返回ret;
}
int[]arr={5,3,2,0,4,1};
int tmp=arr[0];
整数和=0;
对于(int i=0;i
我会使用一个辅助的
布尔[]
来告诉我们是否第二次点击索引。因为你显然需要一种方法来存储你已经看到的元素,而且在最坏的情况下,这种结构会占用线性空间,你也可以使用它。我会这样做

public static boolean arrayIsCompleteChain(int[] array) {
    boolean[] visited = new boolean[array.length];
    int index = 0;
    int steps = 0;

    // stop once we visit an index twice
    while(!visited[index]) {
        visited[index] = true; // mark index as visited
        index = array[index];  // go to the next index
        steps++;               // count this step
    }

    // if we made one step for every index, then the array is a complete chain
    if(steps == array.length) {
        return true;
    } else {
        return false;
    }

    // for anyone reading this who thinks to himself the "if" construct is
    // unnecessary: this is for didactic purposes
}

请注意,此方法不会对输入进行任何验证检查,例如,它是否包含将索引置于界限之外的元素,或者数组本身是否为
null
。如果需要,这非常容易。

“但是如果有人能解释我如何实现循环”-可能是基础java教程?您是否向助教/讲师/教授寻求帮助?您是否需要描述此算法的伪代码?等等..您是否需要一个循环或某种方法来验证数组的成员是否顺序有效?就像一种验证在整数数组中,当您通过el时数组中按顺序递增或递减的元素?java数组有一个长度属性,而不是方法。因此,您实际上需要使用
array.length
而不是
array.length()
upss!是的,对不起。我使用的最多的是List.size():D吗