2011-12-28 18 views
7

Tôi có một mảng có giá trị 1 2 3 4 5.truy cập mảng java theo cách tròn

array a = [ 1 , 2, 3, 4, 5] 

Bây giờ tôi muốn duyệt qua theo cách tròn. như tôi muốn in 2 3 4 5 1 hoặc 3 4 5 1 2 hoặc 5 1 2 3 4 v.v. mọi thuật toán về vấn đề này?

Chỉnh sửa: Tôi muốn in tất cả kết hợp theo cách tròn. tôi không muốn nêu rõ điểm khởi đầu ở giai đoạn ban đầu.

Trả lời

18
int start = ... 
for (int i = 0; i < a.length; i++) { 
    System.out.println(a[(i + start) % a.length]); 
} 

tôi nên lưu ý rằng điều này có lẽ không phải là cách hiệu quả nhất để thể hiện vòng lặp ... trong ter ms tốc độ thực thi. Tuy nhiên, sự khác biệt là nhỏ và rất có thể không liên quan.

Điểm phù hợp hơn là sử dụng % theo cách này sẽ cung cấp mã dễ đọc hơn. Tôi nghĩ thế, nhưng có lẽ đó là vì tôi đã nhìn thấy/sử dụng thành ngữ đặc biệt này trước đây.

+0

đẹp, sạch hơn nhiều, tôi thực sự nghĩ nhiều hơn .. –

+0

Toàn bộ bài đăng này thực sự nhắc tôi về vấn đề buzz mờ ngu ngốc đó, rất nhiều người trả lời với các giải pháp không phức tạp quá phức tạp, khi có cách dễ dàng hơn để làm những việc không nỗ lực – AlanFoster

+0

Tôi đã cung cấp cho bạn +1 cho giải pháp ba dòng cũng đề cập đến các trường hợp bị giới hạn. Tuy nhiên, tôi đồng ý với mối quan tâm về khả năng đọc của bạn - tôi nghĩ rằng vòng lặp có vẻ như đây là một lần lặp lại bình thường. . –

1

Làm thế nào về những điều sau đây:

int start = // start position, must be in bounds 
int i = start; 
do { 

    .... 

    i++; 
    if(i == a.length) i = 0; 
} while(i != start); 
+0

giá trị bắt đầu là gì? tôi không muốn sửa chữa giá trị bắt đầu –

+0

Bắt đầu là bất cứ nơi nào bạn muốn bắt đầu truyền tải trong mảng. Để in 3 4 5 1 2, bắt đầu phải là 2, hoặc để in 1 2 3 4 5 bắt đầu phải là 0 - có lẽ tôi đã hiểu lầm câu hỏi của bạn? –

1
int st = n ; // n is the starting position from where you print 
for(int i = st; i < a.length; i++) 
{ 
    -- print each array[i]; 
} 

if(st != 0) 
{ 
    for(int i = 0 ; i < st ; i++) 
    { 
     --- print each array[i]; 
    } 
} 
1

Về cơ bản bạn chỉ cần lặp qua mảng, và thay đổi các chỉ số hiện tại nếu cần thiết (như di chuyển nó đến khi bắt đầu của mảng khi nó đáp ứng các cuối)

public static void main(String[] args) { 
    int[] array = new int[] { 1, 2, 3, 4, 5 }; 
    System.out.println(printCircularly(array, 4)); 
} 

private static String printCircularly(int[] array, int startIndex) { 
    StringBuilder sb = new StringBuilder(); 
    int currentIndex = startIndex; 
    do { 
     sb.append(array[currentIndex++]); 
     if (currentIndex > array.length - 1) { 
      currentIndex = 0; 
     } 
    } 
    while (currentIndex != startIndex); 
    return sb.toString(); 
}