2016-03-25 10 views
3

私は非常にJavaに新しい、配列とarraylistsを使用してプログラムを記述しようとしていますが、多くの値を入力し、アスタリスクを使用する2つのパラメータ。 例:配列/ arraylistsを使用してアスタリスクに値を変更する方法

[5,14,23,43,54,15] 
1-10: * 
11-20: ** 
21-30:* 
31-40: 
41-50:* 
51-60: * 

など。これまで私がこれまで持っていたことはありますが、エラーが出てきて例外を越えています。私は正しい道にいるかどうか誰でも言うことができますか?どんな助けもありがとう!

package arraylists; 

import java.util.ArrayList; 
import java.util.Scanner; 

public class numberslists { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner reader = new Scanner(System.in); 
     ArrayList numbers = new ArrayList(); 
     int [] number = new int[10]; 
     int x, count = 0; 
     System.out.println("how many numbers would you like?"); 
     count = reader.nextInt(); 
     System.out.println("enter in those numbers please"); 
     for (x=0; x < count; x++){ 
      number[x] = reader.nextInt(); 
      numbers.add(number[x]); 
     } 
     System.out.println(numbers); 
     int x10 = numbers.indexOf(number[x] < 10); 
     numbers.remove(x10); 
     System.out.println(numbers); 
    } 
} 
+1

例外からスタックトレースを見てください。問題の原因となったコード行を特定します。次に、コード行を見て、その行に何が間違っているのか自分自身に尋ねます。 (ヒント:ループが終了した後の 'x'の値は何ですか?)また、未処理の' ArrayList'を使用しているので、非常に有用なコンパイラのフィードバックを逃してしまいます。たとえば、 'number [x] <10'はブール値ですが、' Boolean'オブジェクトは 'numbers'に入れません。 –

+0

2つのパラメータの間の値の数を計算します。あなたが話す2つのパラメータを入力または設定していますか? – pczeus

答えて

0

ユーザーからカウントを取得した後に配列を宣言します。

int x, count = 0; 
System.out.println("how many numbers would you like?"); 
count = reader.nextInt(); 
int [] number = new int[count]; 

また、エラーの原因となったコードの行を見てください。

0

私にとっては、入力配列にある各範囲のカウンタを格納するMapとしては、これは意味があります。今度は、各入力がその範囲内に収まるかどうかを最初に把握してから、範囲に一致するカウンタを更新する必要があります。範囲を出力用の文字列として計算し、カウンタをアスタリスクの文字列として表現する必要があるため、範囲をMap.keyの文字列として、アスタリスクの文字列としてカウンタをMap.valueとして格納するとうまく動作します。

ここでは、数字だけがユーザによって入力された元の値のArrayListであるいくつかのコード例を示します。ユーザーが値を入力した場合の出力の例として

//Declare a Map that stores the range as a String ("01-10") as the key 
    //and a counter in astericks as the value 
    Map<String,String> counters = new HashMap<>(); 

    //Loop over the array ov values 
    for(Integer value: numbers){ 
    //For each value calculate the diviser by diving by 10 
    Integer lowRange = value/10; 
    //To get the low range, multiply the diviser by 10 and add 1 
    lowRange = (10 * lowRange) + 1; 
    //The high range is 9 mor ethan the low range 
    Integer highRange = lowRange + 9; 
    //Finally calcualte what the range looks like as a String 
    //Note that it handles "1" as a special case by prepending a "0" to make the value "01" 
    String rangeString = ((lowRange < 10) ? "0" + lowRange : lowRange) + "-" + highRange; 

    //Now check the map to see if the rangeString exists as a key, meaning 
    //we have previously found a value in the same range 
    String count = ""; 
    if(counters.containsKey(rangeString)){ 
     //If we found the same range, get the previous count 
     count = counters.get(rangeString); 
    } 

    //Place the count back into the map keyed off of the range and add an asterick to the count String 
    counters.put(rangeString, count + "*"); 
    } 

    //Finally iterate over all keys in the map, printing the results of the counters for each 
    for(String range: counters.keySet()){ 
    System.out.println(range + " " + counters.get(range)); 
    } 

、:

[5,14,23,43,54,15,41]

は、出力は次のようになります。要するに

01-10 * 
11-20 ** 
41-50 ** 
51-60 * 
21-30 * 
+0

出力行の順序が重要な場合は、順序マップを考慮してください。 TreeMap(上記のHashMapの代わりに)はそのような実装の1つです。 – chsbellboy

+0

@chsbellboy良い点。 – pczeus

2

、Lahiruが言ったように、あなたが必要行を変更する:int x10 = numbers.indexOf(number[x] < 10);

の主な問題あなたのコードはブール値(真または偽)を返す式number[x] < 10です。したがって、numbers.indexOf(number[x] < 10)は1または-1を返します。

最後に、コードがnumbers.remove(x10);になり、-1が(falseの場合)numbers.remove(-1);を実行する方法がないため、java.lang.ArrayIndexOutOfBoundsExceptionが得られます。 documentationを参照してください。

コードに改善の余地があります。以下はあなたができることに対する提案です。しかし、あなた自身のコードを修正した後で、この提案を見てください(あなたはより良い学習経験を得ることができます)。

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

public class CountOcurrancesInArray { 

    private static Scanner reader = new Scanner(System.in); 
    private static List<Integer> numbers = new ArrayList<Integer>(); // Use generics when possible: <Integer> 
    public static void main(String[] args) { 
      int x, count = 0; 
      System.out.println("how many numbers would you like?"); 
      count = reader.nextInt(); 
      System.out.println("enter in those numbers please"); 
      for (x=0; x < count; x++){ 
       // I don't see a need for this line. number[x] = reader.nextInt(); 
       numbers.add(reader.nextInt()); 
      } 
      System.out.println(numbers); 
      int[] comparingNumbers = requestComparingNubers(); 
      System.out.println("You entered these numbers: " + numbers); 
      String matchingNumbers = checkForNumbersInTheList(comparingNumbers); 
      System.out.println("Numbers between " + comparingNumbers[0] + "-" + comparingNumbers[1] + ":" + matchingNumbers); 
    } 

    /** 
    * Counts how many entries are in the list between 'comparingNumbersInput' 
    * @param comparingNumbersInput 
    * @return number of entries as asterisks "*" 
    */ 
    private static String checkForNumbersInTheList(int[] comparingNumbersInput) { 
     String result = ""; 
     for(Integer i : numbers) { 
      if (i >= comparingNumbersInput[0] && i <= comparingNumbersInput[1]) { 
       result += "*"; 
      } 
     } 
     return result; 
    } 

    /** 
    * Asks the user to enter 2 numbers to be compared against the all the numbers in the list. 
    * @return returns a int[2] sorted ascendingly 
    */ 
    private static int[] requestComparingNubers() { 
     int [] result = new int[2]; 
     System.out.println("Counting how many numbers there are in between x and y."); 
     System.out.println("What is the first number?"); 
     result[0]=reader.nextInt(); 
     System.out.println("What is the second number?"); 
     result[1]=reader.nextInt(); 
     // Sort comparingList 
     if (result[0] > result[1]) { 
      int temp = result[1]; 
      result[1] = result[0]; 
      result[0] = temp; 
     } 
     return result; 
    } 
} 
+1

これは元の質問よりも多少柔軟性がありますが、確かにうまくいきます! – chsbellboy

+0

これは彼が求めているのではなく、2つの数字だけを比較して、ユーザーに入力するように頼むのはなぜですか? Btw、あなたは非効率な方法でこのタスクを実行しました。その1つのループですべてを行うことができます。 – iantonuk

+0

@bedbad、それで、私は「改善の余地がある」と言いました。私がOPが探している解決策を提示しようとしていると同時に、それをあまり混乱させずに「いくつかの」改善を提示しています。 – Rafa

0

Java配列は、0から始まるインデックスです。あなたは10個の要素を持つ配列を宣言した場合、Javaがループ「のための」

for (x=0; x < count; x++){ 
    number[x] = reader.nextInt(); 
    numbers.add(number[x]); 
} 

終了すると例えば、これらの要素のインデックスは、以下のコードスニペットでは9まで0

からになります変数xの値は、数値配列に入力した要素の数と等しくなります(x = count)。あなたは以下のようにx位置にある要素を取得するとき

ので、:

int x10 = numbers.indexOf(number[x] < 10); 

< 10×もし、あなたが取得する-1 X10のために。

numbers.remove(x10); 

のx> = 10、番号[x]は

0

さらに別の宿題の質問に発生しますは、ArrayIndexOutOfBoundsExceptionが

import java.util.ArrayList; 
import java.util.Scanner; 
import java.util.*; 

public class numberlists { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner reader = new Scanner(System.in); 
     LinkedList <Integer> numbers = new LinkedList <Integer>(); 
     //int [] number = new int[10]; no need, and the input is variable size 
     int x, count = 0; 
     System.out.println("how many numbers would you like?"); 
     count = reader.nextInt(); 
     System.out.println("enter in those numbers please"); 
     Map < Integer, Integer > range_numbers = new HashMap < Integer, Integer >(); 


     for (x = 0; x < count; x++) { 
      //number[x] = reader.nextInt(); no need 
      numbers.add(reader.nextInt()); 
      int rs = ((int) numbers.getLast()/10) * 10 + 1; //range start for number i.e rs(15)=11 
      if (!range_numbers.containsKey(rs)) { //check if has number in that range 
       range_numbers.put(rs, 1); 
      } else { //gets the prev count, add 1 and stores back for range 
       range_numbers.put(rs, range_numbers.get(rs) + 1); 
      } 

     } 

     System.out.println(numbers); 
     Map < Integer, Integer > sortedpairs = new TreeMap < Integer, Integer > (range_numbers); // need to sort 

     for (Map.Entry < Integer, Integer > pair: sortedpairs.entrySet()) { 
      System.out.printf("\n%d-%d: %s", pair.getKey(), pair.getKey() + 9, 
       new String(new char[pair.getValue()]).replace("\0", "*")); 
      //little trick to repeat any string n times 
     } 

    } 
} 

楽しむ場合:次に、例外がで発生します。

関連する問題