1

こんにちは、ユーザーが引数として n と k の 2 つの数字を入力する必要がある宝くじメソッドを作成しています。宝くじは、k までランダム化されたキューで満たされます。したがって、k=10 を入力すると、キューは 1,2,3,4,5,6,7,8,9,10 を保持します。引数 n は、ランダムに削除する必要があるアイテムの数です。したがって、3 を選択した場合、4、6、8 または 1、3、10 が返される可能性があります。

n が k より大きい場合、プルするのに十分なアイテムがキューにないというエラーをスローする必要があります。したがって、n=5 と k=3 を入力すると、キューにはまだ 3 つのアイテムがありますが、キューから 5 を選択することはできません。これは多すぎるためです。

今私の問題は、まだキューにあるアイテムを返さなければならないことです。したがって、n=5 および k=3 は 1,3,2 または 2,3,1 などを返します。しかし、その配列を返した後、例外を出力する必要があります。これまでのところ、配列を返すことはできますが、try catch 例外を機能させることができません。私が試すことができる別の方法はありますか 配列を返し、その後例外を出力するので、次のようになります。

%java Lottery 5 2 //calls the method with the arguments n=5 k=2
2  1    //still prints the items in the queue
java.lang.Exception: Not enough items in your queue. // returns the error as well
at Lottery.pickNumbers(Lottery.java:29) //dont pay attention to these line numbers, this was a test case given to us
at Lottery.main(Lottery.java:56)

これが私のコードです:

import java.util.*;
import java.math.*;
public class Lottery{
    RandomizedQueue rq;
    Random Rnum = new Random();
    int [] Larray;

    // constructs a Lottery class
    public Lottery(){
    }


    // picks the numbers and store them in an array of integers
    // int n: number of items to pick
    // int k: maximum integer to be picked

   public int [] pickNumbers(int n, int k) throws Exception{

        rq = new RandomizedQueue();

        int [] remainQueue = new int [k];


        if(n>k) 
        {
            for(int i=1; i<=remainQueue.length;i++)
            {
                rq.enqueue(i);
            }
                for(int i=0; i<remainQueue.length;i++)
                {
                    remainQueue[i] = rq.dequeue();
                }
                return remainQueue; 
        }  





        for(int i =1;i<=k;i++)
        {
            rq.enqueue(i);
        }

        Larray = new int[n];
        for(int i = 0;i< Larray.length;i++)
        {
            Larray[i] = rq.dequeue();
        }

        return Larray;


    }



    // Do not change main().
    public static void main(String [] args) throws Exception{
        if (args.length<2){
           System.out.println("Please enter your input values.");
           System.out.println("e.g. java Lottery [number of integers to pick] [Maximum integer to be picked]");
       }else{
           int n = Integer.parseInt(args[0]);
           int k = Integer.parseInt(args[1]);
           Lottery l = new Lottery();
           try{
           int [] picked = l.pickNumbers(n,k);
           for (int i = 0; i< picked.length; i++){
               System.out.print(picked[i]+" ");
           }
           System.out.println();
           }catch (Exception e){
           e.printStackTrace();
           }
       }



    } 

}
4

8 に答える 8

2

この目的のために、独自のカスタム例外を作成する必要があります。手順に従ってください。-> 例外を拡張するクラスを作成 -> 独自の例外とハンドリングを作成

public class MyException extends Exception {
// special exception code goes here
}

次のように投げます:

throw new MyException ("Something happened")

Catch as:

catch (MyException e)
{
// something
}

ここであなたの場合 if(n

于 2013-02-06T08:45:31.307 に答える
1

できません。それをすることは意味がありません。例外は、例外的な動作に使用されます。私が理解していることから、キューにあるよりも多くのアイテムを要求することは、予想される動作です(つまり、「残りのキューを返す」というユースケースがあります。したがって、エラーを処理する場合は、次のようにする必要があります。

if (picked.length != k)
{
  System.out.println("You are attempting to choose more numbers than there are items (left) in the pool");
}

あるいは、値nとKが事前にわかっているので、入力検証を行うだけで済みます。

if (k>n)
{
  System.out.println("The amount of available numbers is smaller than the amount of numbers you wish to draw.")
}

また、おそらく配列の代わりにセットを使用する必要があります。

于 2013-02-06T08:53:43.357 に答える
1

以下のコードのようにメインメソッドを変更します。例外がない場合は、例外が発生した場合に期待どおりに結果を取得し、以前に入力された配列を取得して表示します。このようにして、入力された結果と例外の両方が得られます。

import java.util.*;
import java.math.*;
public class Lottery{
    RandomizedQueue rq;
    Random Rnum = new Random();
    int [] Larray;

    // constructs a Lottery class
    public Lottery(){
    }


    // picks the numbers and store them in an array of integers
    // int n: number of items to pick
    // int k: maximum integer to be picked

   public int [] pickNumbers(int n, int k) throws Exception{

        rq = new RandomizedQueue();

        int [] remainQueue = new int [k];


        if(n>k) 
        {
            for(int i=1; i<=remainQueue.length;i++)
            {
                rq.enqueue(i);
            }
                for(int i=0; i<remainQueue.length;i++)
                {
                    remainQueue[i] = rq.dequeue();
                }
                return remainQueue; 
        }  





        for(int i =1;i<=k;i++)
        {
            rq.enqueue(i);
        }

        Larray = new int[n];
        for(int i = 0;i< Larray.length;i++)
        {
            Larray[i] = rq.dequeue();
        }

        return Larray;


    }



    // Do not change main().
    public static void main(String [] args) throws Exception{
        if (args.length<2){
           System.out.println("Please enter your input values.");
           System.out.println("e.g. java Lottery [number of integers to pick] [Maximum integer to be picked]");
       }else{
           int n = Integer.parseInt(args[0]);
           int k = Integer.parseInt(args[1]);
           Lottery l = new Lottery();
           try{
           int [] picked = l.pickNumbers(n,k);
           for (int i = 0; i< picked.length; i++){
               System.out.print(picked[i]+" ");
           }
           System.out.println();
           }catch (Exception e){
               int [] picked = l.Larray;
               for (int i = 0; i< picked.length; i++){
                   System.out.print(picked[i]+" ");
               }
               System.out.println();


           e.printStackTrace();
           }
       }



    } 

}
于 2013-02-06T08:52:19.973 に答える
1

これは私がそれを行う方法です。完全な作業コード:

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

public class Lottery {
    public void pickNumbers (int n, int k, List<Integer> values)
        throws Exception
    {
        RandomizedQueue <Integer> rq = new RandomizedQueue <Integer> ();

        for (int i = 0; i < k; i++)
            rq.enqueue (i);

        if (n <= k)
        {
            for (int i = 0; i < n; i++)
                values.add (rq.dequeue ());
        }
        else
        {
            for (int i = 0; i < k; i++)
                values.add (rq.dequeue ());

            throw new Exception ("N > K");
        }
    }

    public static void main (String [] args)
    {
        int n = Integer.parseInt (args [0]);
        int k = Integer.parseInt (args [1]);
        Lottery l = new Lottery ();
        List <Integer> picked = new ArrayList <Integer> (n);
        try
        {
            l.pickNumbers (n, k, picked);
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }

        for (int i = 0; i < picked.size (); i++){
            System.out.print (picked.get (i) + " ");
        }
        System.out.println();
    }

    private static class RandomizedQueue <T> extends ArrayList <T>
    {
        private final Random r = new Random ();

        public void enqueue (T x)
        {
            add (x);
        }

        public T dequeue ()
        {
            return remove (r.nextInt(size ()));
        }
    }
}
于 2013-02-06T09:19:31.553 に答える
0
  • Exceptionオーバーライドする独自のタイプを作成できますsetMessage

  • e.printStackTrace()または使用する代わりに単純e.getMessage()

于 2013-02-06T08:53:14.307 に答える
0

メソッドから throw Exception の値を返すことはできますが、両方を同時に行うことはできません。

カスタム Exception クラスを作成し、処理された結果を保持して、例外が発生した場合にそれをスローできる場所を作成できます。

public class MyException extends Exception{
     private int[] processedResult;
     public MyException(String str,int[] result){
        this.processedResult = result;
     }
     ...
     @override
     public String toString(){
       ....
     }
} 

...

public int [] pickNumbers(int n, int k) throws MyException{
    int[] larray = new int[n];
    try{
       ...
    }catch(Exception ex){
        new MyException("...",larray );
    }
}
于 2013-02-06T08:40:41.137 に答える
0

このアプローチを試してください:

  1. でリストを作成するmain()
  2. そのリストをに渡しますpickNumbers()
  3. 戻り、pickNumbers()代わりvoidに結果をリストに追加します。
  4. エラーが発生した場合は、例外をスローします
  5. main()、例外をキャッチします。リストには、これまでに計算されたすべての結果が含まれます。

または、既存の結果を引数として受け入れる独自の例外を作成します。main()その後、例外からそれらを読み取ることができます。

于 2013-02-06T08:44:19.933 に答える
0

例外をスローすると同時に値を返すことはできません。

一歩下がって、あなたが達成しようとしていることを見てください。メソッドから複数の値 (数字とステータスのリスト) を返す必要があります。これは、プレーンではなく、これらの値を含む複雑なオブジェクトを返すことを示唆していますint[]

public class LotteryPick {
    public int status;
    public int[] numbers;
}

public LotteryPick pickNumbers(int n, int k) {
...
}

実際には、Set<Integer>for numbers、 enum for status、おそらくフィールドには getter/setter を使用します。

または、例外をスローする必要がある場合は、選択した数値を保持するための int[] フィールドを持つカスタム例外クラス ( ... extends IllegalArgumentException?) を作成します。ただし、このアプローチはお勧めしません。いずれにしても機能的には上記と同等です。

于 2013-02-06T09:27:30.350 に答える