【最大10000ポイント】当たる!!質問投稿キャンペーン!

配列を使った場合のカレンダー表示方法で質問します。
現在、
Calendarクラスを使い、配列に日を入れていくようにしているのですが

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at CalendarSample.main(CalendarSample.java:33)
のようなエラーが生じます。

以下のような手順でで考えることは可能なのでしょうか?
よろしくお願いします。

Calendar cal = Calendar.getInstance();

//最終日
int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

//月の週の合計数
int week = cal.get(Calendar.WEEK_OF_MONTH);

//日を格納する配列
int[][] date = new int[week][7];

int n = 0;
for(int d=1;d<=max;d++){
//年月日の設定
cal.set(2011,6,d);

int youbi = cal.get(Calendar.DAY_OF_WEEK);
date[n][youbi] =d;
//日が、土曜になったら、配列の列を変える
if(cal.get(Calendar.DAY_OF_WEEK)==6){
n+=1;
}
}

A 回答 (2件)

    • good
    • 0

とりあえず, その例外がどこで出ているのかを考えたらどうだろうか.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「eclipseで作るカレンダー(スケジュール管理画面)」

「eclipseで作るカレンダー(スケジュール管理画面)」

こんばんは。現在、eclipseでカレンダーを作りたいと思っております。また、一目でその月のスケジュールがわかるようにし、日付をクリックするとその日のスケジュールの詳細を表示できるようにしたいと思っております。カレンダーは1カ月ごとに日付を表示し、左右のボタンを押すと前の月、次の月に移動するものにしたいと思っております。

インターネット上でカレンダーの作り方を調べても全くわかりません。コマンドプロンプト上でカレンダーを表示するものしかないのです。そうではなくて、私はアプリケーションに以上の機能を持ったカレンダーを作りたいのです。どうやって作ったらいいのか、教えてください。私はjavaはまだまだ初心者ですが、よろしくお願い致します。

※なお、別の質問カテゴリーに同様の質問がございますが、ご回答を確実に頂くためにこちらのカテゴリーからも質問させていただきました。

Aベストアンサー

参考URLにあるような感じでしょうか?
自分もまだまだ初心者なので技術的なことは教えれませんが・・・・

参考URL:http://www.javadrive.jp/servlet/schedule/

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

QString型の日付(2005/11/25)の比較

Java初心者です。String型で2005/11/25 のように2つString型で日付を取得したときに、大小の比較をしたいのです。どういう方法が考えられますか?よろしくお願いします。

Aベストアンサー

書式がyyyy/mm/ddで決め打ちならば他の方が書かれているとおりString#compareTo()で充分でしょう。
yyyy/m/dなど書式が不定の場合には、java.text.DateFormatを利用してjava.util.Dateに変換して比較するか、/で文字列を分解し、年・月・日を抽出してそれぞれを比較するなどが考えられます。

Q生年月日と今日の日付から年齢を取得するロジック

お世話になります

生年月日 :19750401
本日の日付:20021009

の二つの情報(19750401と20021009)より年齢を取得する必要に迫られているのですが、どのようなロジックで取得できるでしょうか?

西暦同士を単純に引くだけでは正確な値ではないと思うのですが。。。

宜しくお願いします。

Aベストアンサー

皆さんが方法論を提示されましたので、私はJavaでの具体的な記述に絞って書いてみます。

先ず。

>生年月日 :19750401
>本日の日付:20021009

を、文字列と仮定します。
これを、java.util.Calendar に変換する為、今回はjava.text.SimpleDateFormat を使ってみます。

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar birthDay = Calendar.getInstance();
birthDay.setTime(sdf.parse("19750401"));
Calendar today = Calendar.getInstance();
today.setTime(sdf.parse("20021009"));

これで、誕生日と本日のCalendarインスタンスが出来ます。
次に、このCalendarインスタンスの年を取得し本日から誕生日を引けば年齢がわかります。

int age = today.get(Calendar.YEAR)-birthDay.get(Calendar.YEAR);

問題は、皆さんが指摘されているように、月日によって上記の結果から -1 をしなければならないのですが、これは色々とやり方はあるとは思いますけど、今回は「何と無く」java.util.Calendar#clear() を使いました(笑

birthDay.clear(Calendar.YEAR);
today.clear(Calendar.YEAR);

if(birthDay.after(today)){
age-=1;
}

これで、age に年齢が入るものと思います。
閏年等の問題は、ここでは省きましたので後はご自身で。

上記の動作テスト用に、下記にソースのまとめます。
コマンド引数で誕生日、当日のデータを入力して下さい

import java.util. * ;
import java.text. * ;

class HowOldAreYou {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar birthDay = Calendar.getInstance();
birthDay.setTime(sdf.parse(args[0]));
Calendar today = Calendar.getInstance();
today.setTime(sdf.parse(args[1]));
int age = today.get(Calendar.YEAR)-birthDay.get(Calendar.YEAR);
birthDay.clear(Calendar.YEAR);
today.clear(Calendar.YEAR);
if(birthDay.after(today)) {
age-=1;
}
System.our.println("年齢は、" + age + "歳です");
}
}

皆さんが方法論を提示されましたので、私はJavaでの具体的な記述に絞って書いてみます。

先ず。

>生年月日 :19750401
>本日の日付:20021009

を、文字列と仮定します。
これを、java.util.Calendar に変換する為、今回はjava.text.SimpleDateFormat を使ってみます。

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar birthDay = Calendar.getInstance();
birthDay.setTime(sdf.parse("19750401"));
Calendar today = Calendar.getInstance();
today.setTime(sdf.parse("...続きを読む

Qカレンダーのプログラムなのですが・・・

入力なしで、2004 年 7 月のカレンダーを1行あたり1週が表示される形で出力する(1行あたり1週表示されていれば,多少左右の位置がずれていてもよい)プログラムの書き方がわかりません。
簡単な問題かもしれませんが、教えてください!

Aベストアンサー

>入力なしで・・・というのがコマンドラインパラメータでなくてという意味でしょうか?そのときはmonthに直接代入してください。←よけいなお世話かも。

当方もJAVA初心者でおこがましいのですが回答が無い様なので・・・・

//2004年カレンダーの表示 コマンドラインパラメーターで表示月を入力
public class Calender{
public static void main(String[] args){

int month , i , weekday , arrday ;
//月の日数を格納 mth[0]の 4 は2004年元日の位置(シフト用)
int[] mth = {4,31,29,31,30,31,30,31,31,30,31,30,31};
String week = " 日 月 火 水 木 金 土";
month = Integer.parseInt(args[0]);
//表示する月以前の累積日数を計算するループ
int alldays = 0 ;
for (i= month -1 ; i >= 0 ;i-- ) {
alldays = mth[i] + alldays ;
}
//初日の位置決め 
weekday = alldays % 7 ;
//配列の生成数 当月日数+開始位置+1
arrday = mth[month] + weekday +1;
//String の配列宣言 
String[] day = new String[arrday];
//配列に格納する String型の初期化
String sday = "";
//配列に格納するループ
for ( i=0 ; i < arrday ; i++ ) {
//格納する日付をString型に変換
sday = String.valueOf( i - weekday );
if ( i <= weekday ) {//開始までの空白条件
day[i] = " ";
} else if ( (i - weekday) < 10 ) {
day[i] = " " + sday ;//一桁の位置調整条件
} else {
day[i] = " " + sday ;
}
}
System.out.println( "\n ★" + month +"月のカレンダー★\n");
System.out.println( week );
//表示用のループ 7配列表示で改行
for ( i=0 ; i < arrday ; i++ ) {
System.out.print( day[i] );
if ( i % 7 == 0 ) {
System.out.println();
}
}
System.out.println();
}
}

コマンドプロンプトで以下のように出力されます。
★7月のカレンダー★

日 月 火 水 木 金 土

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

>入力なしで・・・というのがコマンドラインパラメータでなくてという意味でしょうか?そのときはmonthに直接代入してください。←よけいなお世話かも。

当方もJAVA初心者でおこがましいのですが回答が無い様なので・・・・

//2004年カレンダーの表示 コマンドラインパラメーターで表示月を入力
public class Calender{
public static void main(String[] args){

int month , i , weekday , arrday ;
//月の日数を格納 mth[0]の 4 は2004年元日の位置(シフト用)
int[] mth = {4,31,29,31,30,31,...続きを読む

QServletからHTMLページへの遷移について

初めまして。

JDK:1.5.0_10
Apache Tomcat:/5.5.15
の環境で、Java Servletを組んでいます。

実現したい処理があるのですが、いろいろ調べても見つからないので質問させて頂きます。

1.クライアントがボタンを押す(.htmlのページ)
2.1から命令を受け取ってサーブレットが処理する
3.1のページを更新して再表示してあげる
というようなものです。

わからないのが、3の サーブレットからHTMLへページ遷移する方法です。

すみませんが、何か方法があったら教えて下さい。

Aベストアンサー

処理が終わった後にサーブレットのページを表示させずに、パッと元のHTMLに戻るということですよね?
でしたら、
response.sendRedirect("XXX.html");←これをサーブレットの最後に入れればhtmlに遷移します。
responseですが、HttpServletResponseクラスの名前が、resとかならば
res.sendRedirect("XXX.html");という感じになります。

■サンプルページ
Java 入門 | Servlet/JSP/Java Bean | リダイレクト:http://www.nextindex.net/java/servlet/sendRedirect.html
リダイレクト(redirect) - サーブレット間の連携 - サーブレット入門:http://www.javadrive.jp/servlet/dispatch/index4.html

QTimestamp型への変換について(Java)

ユーザから入力された8桁の数値をTimestamp型に変換する、下記のプログラムを作成したのですが、
例えば、"20111031"を入力して実行した時に、
最終的に出力されるデータは"2011-10-31 23:59:59.0"となります。(ミリ秒部分が"0")

これを、
"2011-10-31 23:59:59.9"(ミリ秒部分が"9"など)のように、
その日の時刻一杯になるような値に変換するには、
プログラムをどのように修正すれば良いでしょうか?



import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class TimeCheck {

public static void main(String[] args) {

String inputTime = args[0] + "235959";

DateFormat inDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
DateFormat outDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {

String oldTime = outDateFormat.format(inDateFormat.parse(inputTime));

// Timestamp型に変換
Timestamp newTime = Timestamp.valueOf(oldTime);

System.out.print(newTime);

} catch (Exception e) {

e.printStackTrace();

}
}
}

ユーザから入力された8桁の数値をTimestamp型に変換する、下記のプログラムを作成したのですが、
例えば、"20111031"を入力して実行した時に、
最終的に出力されるデータは"2011-10-31 23:59:59.0"となります。(ミリ秒部分が"0")

これを、
"2011-10-31 23:59:59.9"(ミリ秒部分が"9"など)のように、
その日の時刻一杯になるような値に変換するには、
プログラムをどのように修正すれば良いでしょうか?



import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public c...続きを読む

Aベストアンサー

結果が正しく表示されるかもしれないけど。
40点くらいかなぁ。

protected static Timestamp toTimestamp(String ymd) throws ParseException {

 String old = ymd + "235959999";
 Date d = new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(old);
 return new Timestamp(d.getTime());
}

Date#getTime() // return by millisecconds
を利用すれば

String -> Date -> String -> Timestamp が
String -> Date -> Timestamp となる。

さらに Date 化を減らす。

 String ymd2 = ymd.replaceAll("([\\d]{4})([\\d]{2})([\\d]{2})", "$1-$2-$3");
 String old = ymd2 + " 23:59:59.999";
 return Timestamp.valueOf(old);

となる。

結果が正しく表示されるかもしれないけど。
40点くらいかなぁ。

protected static Timestamp toTimestamp(String ymd) throws ParseException {

 String old = ymd + "235959999";
 Date d = new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(old);
 return new Timestamp(d.getTime());
}

Date#getTime() // return by millisecconds
を利用すれば

String -> Date -> String -> Timestamp が
String -> Date -> Timestamp となる。

さらに Date 化を減らす。

 String ymd2 = ymd.replaceAll("([\\...続きを読む

QJavaで年月の取得(YYYYMM形式で)

Javaで“前月”の年月(YYYYMM形式)を取得するロジックを組んだのですが、
以下のコードを実行すると、前月の月が1桁の場合に、「YYYYM」(5桁)の形式になってしまいます。
(元がintなので当然かも知れませんが。)

Calendar calendar = Calendar.getInstance();
String yearMonth =
String.valueOf(calendar.get(Calendar.YEAR)) + String.valueOf(calendar.get(Calendar.MONTH) - 2);

こちら、解決する方法はありますでしょうか?
※他に気掛かりな点としては、2012年の1月に実行した時に、正しく「201112」を返してくれるか、というのもあります。

また、別の実装方法として、以下の場合は「YYYYMM形式」で取得出来るのですが、
“前月”に変換する方法が分かりませんでした。。。

Calendar calendar = Calendar.getInstance();
String yearMonth2 =
new SimpleDateFormat("yyyyMM").format(calendar.getTime());


ロジックはシンプルである方が助かります。
分かる方、教えて下さい!

Javaで“前月”の年月(YYYYMM形式)を取得するロジックを組んだのですが、
以下のコードを実行すると、前月の月が1桁の場合に、「YYYYM」(5桁)の形式になってしまいます。
(元がintなので当然かも知れませんが。)

Calendar calendar = Calendar.getInstance();
String yearMonth =
String.valueOf(calendar.get(Calendar.YEAR)) + String.valueOf(calendar.get(Calendar.MONTH) - 2);

こちら、解決する方法はありますでしょうか?
※他に気掛かりな点としては、2012年の1月に実行した時に、正しく「201112」を返して...続きを読む

Aベストアンサー

Calendar calendar = Calendar.getInstance();
calendar.add( Calendar.MONTH, -1 );
String lastMonth = new SimpleDateFormat( "yyyyMM" ).format( calendar.getTime() );

Javaの開発をするなら、Javadoc くらい読めるようになりましょうね。

Qテキストボックスの入力をリセット

ボタンが押されたら、テキストボックスの入力内容を削除するにはどうしたらいいでしょうか?

Aベストアンサー

こんな感じ。

<form>
<input type=button value="clear" onClick="this.form.t.value = ''">
<input type=text size=50 name=t>
</form>

ボタンの this.form.t の t が、テキストの名前になっていて、押されると
空の文字列を入れる、だけです。

もし、フォーム全体のテキストをクリアするならば、こんな方法もあります。

<form>
<input type=button value="clear" onClick="this.form.reset()">
<input type=text size=50 name=t1>
<input type=text size=50 name=t2>
<input type=text size=50 name=t3>
</form>

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング