質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

6660閲覧

ヒストグラムのプログラムをつくっていますがデータのカウントが上手くいきません

prog1717nm

総合スコア56

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/09 14:05

得点の10点刻みの分布をつくっています。乱数のプログラムから乱数を読みこむ形です。乱数のプログラムとはパイプでつなぐので、そこは問題なくできています。
以下は私がつくったプログラムです。

import java. util.Scanner; public class Histogram{ public static void main(String[]args){ Scanner stdin=new Scanner (System.in); int [] counter=new int[11]; int p=0; counter[p/10]++; while(stdin.hasNext()){ counter[p/10]=stdin.nextInt(); } for(int x=0;x<11;x++){ if(x==10){ System.out.printf("%3d",100); }else{ System.out.printf("%3d-%2d",x*10,x*10+9); } for(int i=0;i<counter[x];i++){ System.out.printf("%3d",counter[x]); } System.out.println(); } } }

出力結果は、
100点の人が何人、90-99の人が何人、というような感じにしたいと思っています。
配列で読み込んで数えあげるのが上手くいかなくて困っています。おかしな点がありましたら教えていただけると助かります。宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こういう感じになるでしょうか。

java

1package sample; 2 3import java.util.ArrayList; 4import java.util.HashMap; 5import java.util.List; 6import java.util.Map; 7import java.util.Optional; 8 9public class Histogram { 10 11 // 入力値 12 List<Integer> points = new ArrayList<>(); 13 14 // ヒストグラム値 15 Map<Integer,Integer> distribution = new HashMap<>(); 16 17 // 値を設定する 18 public void setValues(List<Integer> points) { 19 this.points.addAll(points); 20 } 21 22 // 10点ごとのヒストグラムにした結果を返す。キー名は仮に2桁目以降の値。 23 public Map<Integer,Integer> getDistribution() { 24 points.stream().forEach(point -> { 25 int dist = point.intValue() / 10; 26 int count = Optional.ofNullable(distribution.get(dist)).orElse(0); 27 distribution.put(dist, ++count); 28 }); 29 30 return distribution; 31 } 32}

テストケースは次の通り:

java

1package test; 2 3import static org.junit.Assert.*; 4 5import java.util.Arrays; 6import java.util.Map; 7 8import org.junit.Before; 9import org.junit.Test; 10 11import sample.Histogram; 12 13/** 14 * @author A-pZ 15 * 16 */ 17public class HistogramTest { 18 19 Histogram histogram; 20 21 /** 22 * @throws java.lang.Exception 23 */ 24 @Before 25 public void setUp() throws Exception { 26 histogram = new Histogram(); 27 } 28 29 @Test 30 public void test() { 31 histogram.setValues(Arrays.asList(0,10,20,30,40,50,60,70,80,90,100)); 32 33 Map<Integer,Integer> dist = histogram.getDistribution(); 34 35 assertEquals(new Integer(1) , dist.get(0)); 36 assertEquals(new Integer(1) , dist.get(1)); 37 assertEquals(new Integer(1) , dist.get(2)); 38 assertEquals(new Integer(1) , dist.get(3)); 39 assertEquals(new Integer(1) , dist.get(4)); 40 assertEquals(new Integer(1) , dist.get(5)); 41 assertEquals(new Integer(1) , dist.get(6)); 42 assertEquals(new Integer(1) , dist.get(7)); 43 assertEquals(new Integer(1) , dist.get(8)); 44 assertEquals(new Integer(1) , dist.get(9)); 45 assertEquals(new Integer(1) , dist.get(10)); 46 } 47 48 @Test 49 public void test2() { 50 histogram.setValues(Arrays.asList(10,10,10,10,10,20,21,23,25,27,30)); 51 52 Map<Integer,Integer> dist = histogram.getDistribution(); 53 54 assertEquals(null , dist.get(0)); 55 assertEquals(new Integer(5) , dist.get(1)); 56 assertEquals(new Integer(5) , dist.get(2)); 57 assertEquals(new Integer(1) , dist.get(3)); 58 assertEquals(null , dist.get(4)); 59 assertEquals(null , dist.get(5)); 60 assertEquals(null , dist.get(6)); 61 assertEquals(null , dist.get(7)); 62 assertEquals(null , dist.get(8)); 63 assertEquals(null , dist.get(9)); 64 assertEquals(null , dist.get(10)); 65 } 66 67}

投稿2016/07/09 15:18

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ヒストグラム作成する部分について
int p=0;
counter[p/10]++;

while(stdin.hasNext()){ counter[p/10]=stdin.nextInt(); }


//counterの各要素を0で初期化しておく(ソースコード略)
//以下の処理でヒストグラム作成
while(stdin.hasNext()){
counter[stdin.nextInt() / 10]++;
}

後は表示部も何か変だと思うけど、そこは作った人の考えがわからないと指摘できないです。

投稿2016/07/09 14:12

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問