2014-09-04 7 views
0

왜이 오류가 계속 발생하는지 알 수 없습니다! 대기열을 다루는 것은 처음입니다. 나는 해결책이 간단하다는 것을 확신하고 나는 아마 무언가를 놓치고있다. 어떤지도/도움이 크게 감사한다 : 요세푸스 문제를 다음과 같이범위를 벗어나는 배열, Josephus

import java.util.LinkedList; 
import java.util.Queue; 


public class Josephus{ 
    public static void main(String[] args) 
    { 
     int n = Integer.parseInt(args[0]), 
      m = Integer.parseInt(args[1]); 

     Queue<Integer> q = new LinkedList<Integer>(); 
    for (int i = 0; i < n; i++) 
     q.remove(new Integer(i)); 

    int k = 0; 
    while (!q.isEmpty()) 
    { 
     int x = q.remove(); 

     if (++k % m == 0) 
      System.out.print(x + " "); 
     else 
      q.remove(x); 

    System.out.println(x + " "); 
    } 
    } 
} 

이 코드의 원래 프롬프트입니다. 고대로부터의 요세푸스 문제에서 N 국민은 위기에 처해 있으며 인구 감소를위한 다음 전략에 동의합니다. 그들은 원형 (0에서 N-1까지 번호가 매겨진 위치)에서 자신을 배열하고 원 주위를 따라 가며 한 명만 남을 때까지 모든 M 번째 사람을 삭제합니다. 전설에는 요셉 퍼스가 어디에서 탈피되는 것을 피하기 위해 앉았는지에 대한 설명이 있습니다. 커맨드 라인에서 N과 M을 취하고 사람들이 제거되는 순서를 프린트하는 큐 클라이언트 인 Josephus를 작성하십시오. 그러면 Josephus가 서클에 앉을 위치를 표시 할 것입니다.

+1

'for (int i = 0; i Tom

+0

메인 메서드를 호출 할 때 매개 변수를 전달합니까? 이 예외를 던질 수있는 유일한 명령문은 args 배열을 사용하여 n과 m의 선언입니다. – Dici

답변

0
당신은 당신의 프로그램이 잘못된 방향으로 호출

..., 당신은 매개 변수를 제공해야합니다

java Josephus 5 6 

당신이 (예를 들어) Eclipse를 사용하는 경우 그렇지 않으면, 당신은으로 실행으로 이동해야합니다, 구성을 실행하고 프로그램 인수 필드에 인수를 추가하십시오. 당신은 또한 수동으로 입력 값으로 첫 선을 대체 할 수

int n = 10, m = 5; 

나는 (m, n)의 값의 임의 세트를 실행하며 오류 (그러나 아무것도 인쇄되지 않은)없이 달렸다.

+0

이것이 효과가 있습니다! 고맙습니다! – Smn21

0

들 : 새로 만든 (빈) 대기열에서

Queue<Integer> q = new LinkedList<Integer>(); 
for (int i = 0; i < n; i++) 
    q.remove(new Integer(i)); 

왜 제거 항목? 대신 그들을 추가하십시오!

q.add(new Integer(i)); 
+0

대기열에서 제거하는 대신 추가하려고했습니다. 모든 것이 컴파일되지만 실행하면 예외가 발생합니다. – Smn21

+0

** Array ** OutOfBoundException이 있습니다. 큐는 배열이 아니므로, 사용하는 유일한 배열은 args이므로 문제를 호출하는 방법에서 오는 것이라고 생각합니다. 예외를 제기하는 행은 무엇입니까? – Dici

+0

@ Smn21 줄'q를 다시 생각해보아야합니다.remove (x);'. 이미 큐에서 요소'x'를 제거했습니다. 비슷한 엘리먼트를 제거하고 싶다면'remove (Object o)'가 하나의 엘리먼트 만 제거하기 때문에 이것은 작동하지 않을 것이다. 목록에있는 사람들 중 한 명이 목록에 있어야만 그 중 하나가 대기열에 남아 있습니다. – Tom

0

자바 당신이 int로 전달하고 있기 때문에, while 루프에서 if 문의 다른 문에 remove(int index)를 호출하려는 생각합니다. 해결 방법은 for 루프에서 정확히 수행 한 작업을 수행하는 것입니다.

q.remove(new Integer(x)); 

또한 사용자가 올바른 인수를 명령 줄에 입력했는지 확인해야합니다.

if (args.length != 2){ 
    System.out.println("Invalid arguments."); 
    return; 
} 

int n = Integer.parseInt(args[0]), 
    m = Integer.parseInt(args[1]); 
+0

'remove (int index)'? 그런 방법은 없습니다 ... 적어도 나는 그것을 발견 할 수 없습니다. 'Queue'는'remove()'를 지원하고 구현 된 인터페이스'Collection'은'remove (Object o)'를 지원합니다. – Tom

+0

여전히 동일한 범위를 벗어나는 오류가 발생했습니다. for 루프에서 수행 한 작업을 복제했습니다. – Smn21

+0

java.util.linkedlist 클래스는'remove (int index)'를 지원합니다. [오라클 문서] (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html) – DrOverbuild

0

존재하지 않는 배열 요소에 액세스하려고하면 배열 범위를 벗어나는 예외가 발생합니다.

체크

args.length> = 2이 어레이의 제 2 요소에 액세스를 시도하기 전에. 당신이 명령 줄을 사용하는 경우