2016-08-31 5 views
0

그래서이 프로그램을 작성하여 확률적인 이유로 주사위 롤을 시뮬레이션합니다. 그리고 나는 그 문제를 발견했습니다. 나는 그것이 무엇을하고 있는지를 알고 있습니다, 나는 그것을 고치는 법을 모른다.포인터가 아닌 ArrayList를 만드는 방법

변수가 내 points 변수를 가리키고 있거나 참조하고있는 것이 주된 문제입니다. 따라서 평균을 구할 때가되면 각 diceset의 평균치 대신 모든 dicests의 최고점에 대한 평균값을 얻습니다. points 변수를 지우면 신선한 ArrayList로 시작할 수있게 되겠지만 모든 정보도 지워집니다. succ

이 프로그램을 실행하는 데 관심이있는 사람은 3d6과 같은 dicesets를 입력하십시오. 그것은 개인적인 선택이었습니다, 나는 그것을 n 개의 양면 주사위의 어떤 수에 대해서도 설명 할 수 있었지만, 제 목적을 위해서 단지 최대 5 개가 필요했습니다.

import java.util.Random; 
import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.List; 

public class DiceThing { 
    static Scanner scan = new Scanner(System.in); 
    static int trials; 
    static String bleh = new String("hurr"); 
    static ArrayList <String> dice = new ArrayList <String>(); 
    static ArrayList <Integer> roll = new ArrayList <Integer>(); 
    static ArrayList <Integer> points = new ArrayList <Integer>(); 
    static ArrayList <Integer> num = new ArrayList <Integer>(); 
    static ArrayList <Integer> type = new ArrayList <Integer>(); 
    static ArrayList < ArrayList <Integer>> succ = new ArrayList < ArrayList <Integer>>(); 

    static Random rand = new Random(); 

    public static void main(String[] args) { 
    System.out.println("Enter any number of dicesets. Enter 0 to stop"); 
    while (!bleh.equals("0")) { 
     System.out.println("Enter diceset: "); 
     bleh = scan.nextLine(); 
     if (!bleh.equals("0")) 
     dice.add(bleh); 
    } 

    System.out.println("Enter number of trials: "); 
    trials = scan.nextInt(); 

    for (String i: dice) { 
     num.add(Integer.parseInt(i.substring(0, 1))); 
     type.add(Integer.parseInt(i.substring(2))); 
    } 
    for (int i = 0; i < dice.size(); i++) { //count place in dicesets 
     for (int j = 0; j < trials; j++) { //count trials 
     for (int k = 0; k < num.get(i); k++) //count number of dice in the diceset 
      roll.add(rand.nextInt(type.get(i)) + 1); 

     points.add(countSuccess(roll, type.get(i))); 
     System.out.println(roll.toString() + points.toString()); 

     roll.clear(); 
     } 
     succ.add(points); 
     points.clear(); 
     System.out.println(succ.toString()); 
    } 

    System.out.println("Average success of dice sets:"); 
    for (ArrayList <Integer> i: succ) { 
     System.out.println(average(i)); 
    } 
    } 

    public static int countSuccess(ArrayList <Integer> list, int high) { 
    int suc = 0, temp; 
    for (int i = 0; i < list.size(); i++) { 
     if (list.get(i) >= 5) 
     suc++; 
     if (list.get(i) == high) 
     suc++; 
     if (list.get(i) >= 10) { 
     temp = rand.nextInt(type.get(i)) + 1; 
     roll.add(temp); 
     list.add(temp); 
     } 
    } 
    return suc; 

    } 

    private static double average(ArrayList <Integer> marks) { 
    Integer sum = 0; 
    if (!marks.isEmpty()) { 
     for (Integer mark: marks) { 
     sum += mark; 
     } 
     return sum.doubleValue()/marks.size(); 
    } 
    return sum; 
    } 
} 

원산지가 다른 곳에서도 발생할 수 있지만 문제가 발생합니다.

succ.add(points); 
points.clear(); 
System.out.println(succ.toString()); 

나는 아주 잘 설명하지 못했을 것이다. 어떤 도움이나 설명도 감사 할 것입니다.

+0

조금 문제를 해결할 수 있습니까? 귀하의 액 톨로 문제가 무엇인지는 질문에서 알 수 없습니다. – SomeJavaGuy

+0

'clear'를 호출하는 대신'points' 참조를'succ'에 추가 한 후 새로운'ArrayList'를 참조하게 만드시겠습니까? –

답변

1
succ.add(new ArrayList(points)); 

정확하게 이해했다면 목록의 목록을 원산지와 분리하고 싶습니까?

그렇다면 새 목록을 만들고 원본 컬렉션에서 값을 복사하십시오. 생성자 ArrayList(Collection<? extends E> c)이 도움이 될 것입니다.

그 후 points.clear() 호출은 목록의 값을 변경하지 않습니다.
succ.get(index).clear() 만 지울 것입니다.

내 테스트는이 작업을 발견했다
0

:

succ.add(new ArrayList(points)); 
points.clear(); 

을 나는 OP가 의도하는 동작을 이해 가정 :

  • SUCC이 ArrayLists를 포함하는 시험에서 성공의 ArrayList를입니다 각 시험에서 얻은 포인트 수
관련 문제