ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのVector

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こちらのプログラム、GUIで名前、GPA、AGEとクラスを4つ選択すると言うVectorを使った初歩なプログラムなのですが、うまくいかず困っています。
困っている部分は、jcboBoxのクラスの選択に関して。同じクラスを選択すると、JOptionPaneで警告が出されるようにしているのですが、二つ目と四つ目だけ同じクラスすると警告が出てきません(写真参照)。
どちらさまか、この解決する方法にお力のほうをお借りしたく思います。よろしくお願いします。

// ErrorAlertDemoVector.java
// gives user data input error information and allows correction
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; //contains JOptionPane class
import javax.swing.border.*;
import java.util.*;

public class ErrorAlertDemoVector extends JFrame implements ActionListener {
private JLabel jlbName;
private JTextField jtfName;
private JLabel jlbAge;
private JTextField jtfAge;
private JLabel jlbGPA;
private JTextField jtfGPA;
private JLabel jlbClass1;
private JComboBox jcboClass1;
private JLabel jlbClass2;
private JComboBox jcboClass2;
private JLabel jlbClass3;
private JComboBox jcboClass3;
private JLabel jlbClass4;
private JComboBox jcboClass4;
private JButton jbtClearButton;
private JButton jbtRecordButton;
private JButton jbtRefreshButton;
private String[] classStrings = {"Select class","CS1337","CS2305","CS2336",
"CS3305","CS3335","CS3345","CS3354",
"MATH2417","MATH2419","PHYS2325","PHYS2326"};
private Vector<String> classesOffered;
private Vector<String> classesSelected;
private String name, ageString, gpaString;
private int age;
private double gpa;
private int index;

// Main method
public static void main(String[] args) {new ErrorAlertDemoVector();}

public ErrorAlertDemoVector() {
classesSelected = new Vector<String>();
classesOffered = new Vector<String>();
for(int i = 0; i < classStrings.length; i++){
classesOffered.add(classStrings[i]);
}

jlbName = new JLabel("Name:");
jtfName = new JTextField(15);
jlbAge = new JLabel("Age:");
jtfAge = new JTextField(15);
jlbGPA = new JLabel("GPA:");
jtfGPA = new JTextField(15);
jlbClass1 = new JLabel("Class 1:");
jcboClass1 = new JComboBox(classesOffered);
jlbClass2 = new JLabel("Class 2:");
jcboClass2 = new JComboBox(classesOffered);
jlbClass3 = new JLabel("Class 3:");
jcboClass3 = new JComboBox(classesOffered);
jlbClass4 = new JLabel("Class 4:");
jcboClass4 = new JComboBox(classesOffered);

// Panel labelPanel to hold labels
JPanel labelPanel = new JPanel();
labelPanel.setLayout(new GridLayout(7,1));
labelPanel.add(jlbName);
labelPanel.add(jlbAge);
labelPanel.add(jlbGPA);
labelPanel.add(jlbClass1);
labelPanel.add(jlbClass2);
labelPanel.add(jlbClass3);
labelPanel.add(jlbClass4);

JPanel fieldPanel = new JPanel();
fieldPanel.setLayout(new GridLayout(7,1));
fieldPanel.add(jtfName);
fieldPanel.add(jtfAge);
fieldPanel.add(jtfGPA);
fieldPanel.add(jcboClass1);
fieldPanel.add(jcboClass2);
fieldPanel.add(jcboClass3);
fieldPanel.add(jcboClass4);

jtfName.setText("Rocket Squirrel");
jtfAge.setText("10");
jtfGPA.setText("3.5");

JPanel dataPanel = new JPanel();
dataPanel.setLayout(new BorderLayout());
dataPanel.add(labelPanel,BorderLayout.WEST);
dataPanel.add(fieldPanel,BorderLayout.CENTER);

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(jbtRecordButton = new JButton("Record"));
buttonPanel.add(jbtClearButton = new JButton("Clear"));
buttonPanel.add(jbtRefreshButton = new JButton("Refresh"));

// Set border title
dataPanel.setBorder(new TitledBorder("Student Data"));

jbtRecordButton.addActionListener(this);
jbtClearButton.addActionListener(this);
jbtRefreshButton.addActionListener(this);

add(dataPanel,BorderLayout.CENTER);
add(buttonPanel,BorderLayout.SOUTH);

pack();
setTitle("Student Data");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;

Dimension frameSize = getSize();
int x = (screenWidth - frameSize.width)/2;
int y = (screenHeight - frameSize.height)/2;

setLocation(x, y);
setVisible(true);
}

public void actionPerformed(ActionEvent e) {
if(e.getSource() == jbtRecordButton) {

name = jtfName.getText().trim();
ageString = jtfAge.getText().trim();
gpaString = jtfGPA.getText().trim();
classesSelected.clear();
classesSelected.add((String)jcboClass1.getSelectedItem());
classesSelected.add((String)jcboClass2.getSelectedItem());
classesSelected.add((String)jcboClass3.getSelectedItem());
classesSelected.add((String)jcboClass4.getSelectedItem());

//**********************************************************************
//name format error
//note: could also be done by checking for two space-delimited tokens

String[] tokens = name.split("[ ]+");
if(tokens.length < 2){
JOptionPane.showMessageDialog(null,
"Name must be at least a first and \n" +
"last name separated by a space",
"Name format warning",
JOptionPane.WARNING_MESSAGE);
return;
}

for(int i = 0; i < tokens.length; i++){
if(!isValidName(tokens[i])){
JOptionPane.showMessageDialog(null,
"Names can contain only characters and hyphens",
"Name format warning",
JOptionPane.WARNING_MESSAGE);
return;
}
}

//**********************************************************************
//number format error - age

try{
age = Integer.parseInt(ageString);

}catch(NumberFormatException nfe){
JOptionPane.showMessageDialog(null,
"Age must be an integer",
"Number format warning",
JOptionPane.WARNING_MESSAGE);
jtfAge.selectAll();
jtfAge.requestFocusInWindow();
return;
}

//**********************************************************************
//number format error - gpa

try{
gpa = Double.parseDouble(gpaString);

if(gpa < 0 || gpa > 5.0){
JOptionPane.showMessageDialog(null,
"GPA must be between 0.0 and 5.0",
"Number format warning",
JOptionPane.WARNING_MESSAGE);
jtfGPA.selectAll();
jtfGPA.requestFocusInWindow();
return;
}
}catch(NumberFormatException nfe){
JOptionPane.showMessageDialog(null,
"GPA must be an integer or a double",
"Number format warning",
JOptionPane.WARNING_MESSAGE);
jtfGPA.selectAll();
jtfGPA.requestFocusInWindow();
return;
}
//**********************************************************************
//failure to select four classes (iterator and for loop)
/*
for(index = 0; index < classesSelected.size(); index++){
if(((String)classesSelected.get(index)).equals("Select class")){
*/
Iterator<String> classIter = classesSelected.iterator();
while(classIter.hasNext()){
String classString = (String)classIter.next();
if(classString.equals("Select class")){
JOptionPane.showMessageDialog(null,
"You must select four classes!",
"Class selection warning",
JOptionPane.WARNING_MESSAGE);
return;
}
}

//**********************************************************************
//selecting the same class twice
Vector<String> tempClassesSelected = new Vector<String>(classesSelected);
for(index = 0; index < tempClassesSelected.size() - 1; index++){
String tempClass = (String)tempClassesSelected.remove(index);
if(tempClassesSelected.contains(tempClass)){
JOptionPane.showMessageDialog(null,
"You cannot select the same class twice!",
"Class selection warning",
JOptionPane.WARNING_MESSAGE);
return;
}
}
//**********************************************************************
//no exceptions
System.out.println(name);
System.out.println(age);
System.out.println(gpa);
printClasses();
}else if(e.getSource() == jbtClearButton) {
jtfName.setText("");
jtfAge.setText("");
jtfGPA.setText("");
jcboClass1.setSelectedIndex(0);
jcboClass2.setSelectedIndex(0);
jcboClass3.setSelectedIndex(0);
jcboClass4.setSelectedIndex(0);
classesSelected.clear();
}else if(e.getSource() == jbtRefreshButton) {
jtfName.setText("Rocket Squirrel");
jtfAge.setText("10");
jtfGPA.setText("3.5");
jcboClass1.setSelectedIndex(0);
jcboClass2.setSelectedIndex(0);
jcboClass3.setSelectedIndex(0);
jcboClass4.setSelectedIndex(0);
classesSelected.clear();
}
}
public void printClasses(){
Iterator iter = classesSelected.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
//*****************************************************************
//Utility methods
//*****************************************************************
private boolean isValidName(String name){
return name.matches("[a-zA-Z-]+");
}
}

コメント(5)

問題は次の部分です。
//selecting the same class twice
Vector<String> tempClassesSelected = new Vector<String>(classesSelected);
for(index = 0; index < tempClassesSelected.size() - 1; index++){
String tempClass = (String)tempClassesSelected.remove(index); //←これがまずい
if(tempClassesSelected.contains(tempClass)){

removeするとVectorインスタンスのsizeは1つ減ることになります。

Case 1
Vectorに4つの要素{A, B, A, C}が入っているとした場合の動作は
For Loop 1回目 {A, B, A, C}
index=0 (終了条件: index< 4-1), tempClass=A, {B, A, C}
tempClass要素が含まれているのでエラー、終了

Case 2
Vectorに4つの要素{A, B, C, B}が入っているとした場合の動作は
For Loop 1回目 {A, B, C, B}
index=0 (終了条件: index< 4-1), tempClass=A, {B, C, B}
For Loop 2回目 {B, C, B}
index=1(終了条件: index< 3-1), tempClass=C, {B, B}
//ここで取り出されるのはindex=1なのでBではなくCです。
For Loop 3回目 {B, B}
index=2(終了条件: index< 2-1), 終了条件を満たすのでLoopを抜ける

これで解るでしょうか?
For文の中でイテレーション中の配列サイズが変わるような処理をするのは避けたほうが無難だと思います。(JavaのコレクションフレームワークではIteratorを使っている場合だと例外が発生すると思います)
お言葉のほうをどうもありがとうございました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング