使用两个索引从两端迭代一个数组

时间:2013-07-14 05:51:23

标签: java arrays traversal

这更像是一个自定义的编程练习,而不是一个真正的问题。我有一组java.lang.Comparable个项目。我需要维护两个指针(数组的索引,即int值)i,j。我从数组的开头开始向右移动,直到它遇到一个小于或等于前一个元素的元素。当它这样做时它停止向右移动并最终指向不正常的元素(元素不大于前一个元素)。类似地,j从数组的末尾开始并向左移动,直到找到一个不小于前一个元素的元素。

另外,我需要确保索引不会耗尽数组,即我不能低于0而j不能高于arraylength-1

假设我们有一个包含5个元素的数组。

i = 0;
j = 4;(which is the arraylength-1 )
if C,D,E,F,G is the array ,the final values of i and j will be

i = 4  and j = 0

if array is  J,D,E,F,G  ,the final values of i, j will be

i = 0 , j = 0

if array is B,C,A,D,G , final values of i,j will be 

i = 2 , j = 1

我尝试将逻辑for moving i to the right, using a while loop编码如下。在两种情况下,我能够让它为i指针工作。

public class PointerMovement{
    public static void ptrsPointToOutOfOrderElements(Comparable[] a){
            int lo = 0;
            int hi = a.length-1;
            int i = lo;
            int t=i+1;
            int j = hi;

            //only for moving i to the right .
            while(less(a[i],a[t])){
                if(t == hi){
                    i=t;
                    break;
                }
                i++;
                t++;
            }
            i=t;
            for(Comparable x:a){
                System.out.print(x+",");
            }
            System.out.println();
            System.out.println("bad element or end of array at i="+i+"==>"+a[i]);
        }
    private static boolean less(Comparable x,Comparable y){
            return x.compareTo(y) < 0;
        } 

    public static void main(String[] args) {
            String[] a = new String[]{"C","D","E","F","G"};//works
            //String[] a = new String[]{"B","C","A","D","G"};//works
            //String[] a = new String[]{"J","D","E","F","G"};//fails!
            ptrsPointToOutOfOrderElements(a);

        }
}

我的推理理由如下:

我维护i=0;和另一个变量t=i+1

当while循环失败时,less(a[i],a[t])为false。我们需要返回指向[t]的指针,该指针无序。所以我= t并返回i。

如果我们到达数组的右端,测试if(t == hi)通过,我们指定i = t,现在i指向数组的结尾。

但是,当乱序元素位于数组中的第0个位置时,代码会失败。

Ĵ,d,E,F,G

而不是i(= 0)我们得到i = 1,因为i = t是assgined.i最终指向D而不是J.

有人能指出我正确的方向吗?

更新

这似乎有用

public static void ptrsPointToOutOfOrderElements(Comparable[] a){
        int lo = 0;
        int hi = a.length-1;
        int i = lo;

        while(less(a[i],a[i+1])){
            if(i+1 == hi){
                break;
            }
            i++;
        }
        i++;

        int j = hi;

        while(less(a[j-1],a[j])){
            if(j-1 == lo){
                break;
            }
            j--;
        }
        j--;

        for(Comparable x:a){
            System.out.print(x+",");
        }
        System.out.println();

        if(i>=j){
            System.out.println("pointers crossed");
        }
        System.out.println("bad element or end of array at i="+i+"==>"+a[i]);
        System.out.println("bad element or end of array at j="+j+"==>"+a[j]);

    }

2 个答案:

答案 0 :(得分:1)

我认为你没有问题: String [] a = new String [] {“C”,“D”,“E”,“F”,“G”}; //有效,索引应为4(但应该是这样吗?它表示G是不按规定的。我认为你应该返回5,表示没有任何故障。 String [] a = new String [] {“B”,“C”,“A”,“D”,“G”}; //有效,索引应为2,因为A无序 String [] a = new String [] {“J”,“D”,“E”,“F”,“G”}; //因为第一个乱序元素确实是D,索引1

答案 1 :(得分:0)

我尝试过使用简单的 for 循环。

Error: Problem with `mutate()` column `cat`.
i `cat = ifelse(...)`.
x argument "random_3" is missing, with no default
Run `rlang::last_error()` to see where the error occurred.
In addition: Warning message:
 Error: Problem with `mutate()` column `cat`.
i `cat = ifelse(...)`.
x argument "random_3" is missing, with no default
Run `rlang::last_error()` to see where the error occurred.