2017-05-12 18 views
1

コーディングジレンマの助けが必要なもう1人の初心者。私が作成しようとしているプログラムは、3つの並列配列(userNumber、player、およびHighScore)を使用する小さなデータベースです。ユーザーがプロンプトでユーザー番号を入力する必要があり、プログラムにユーザーの情報が表示されることが意図されています。入力された番号が存在しない場合、プログラムは入力した番号を表示し、正しい番号が入力されるまでユーザー番号を再入力させる必要があります。
私が今実行している問題は、配列リストの有効な番号であるかどうかにかかわらず、プログラムでは配列の最初のユーザー番号以外のユーザー番号を受け付けないことです。また、エラーメッセージには、「間違った」番号が何回入力されたかに関係なく、最初の「間違った」番号のみが表示されます。
正しい質問は次のようになります:
1.入力したuserNumberに対応する配列エントリの情報をプログラムが返すためには、どうすればよいですか?
)入力した「間違った」番号が表示されるように各エラーメッセージを変更するにはどうすればよいですか?数がある場合は、あなたが本当にloopuserNumber配列によるチェックする必要があり、もちろんパラレルアレイの検索と表示の情報

 while (scan < userNumber[0] || scan > userNumber[4]) 
     { 
      System.out.printf("Error #%s Is Unknown User", scan); 
      System.out.print("Enter User# "); 
      scan=input.nextInt(); 
     } 
     // now use the value 
     System.out.printf("%s, user# %s, has a high score of: %s", 
        player[scan-1], userNumber[scan-1], highScore[scan-1]); 

考える -

import java.util.Scanner; 


public class HighScoreSearch 
{ 
    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 

     int[] userNumber = new int[5]; 
     String[] player = new String[5]; 
     Double[] highScore = new Double[5]; 

     userNumber[0]= 1; 
     userNumber[1]= 2; 
     userNumber[2]= 3; 
     userNumber[3]= 4; 
     userNumber[4]= 5; 
     player[0]= "Morpheus"; 
     player[1]= "Neo"; 
     player[2]= "Cereal Killer"; 
     player[3]= "Crash Override"; 
     player[4]= "Acid Burn"; 
     highScore[0]= 853797.67; 
     highScore[1]= 999999.99; 
     highScore[2]= 15097.34; 
     highScore[3]= 864513.16; 
     highScore[4]= 543188.68; 

     System.out.print("Enter User# "); 
     int scan= input.nextInt(); 
     int i=0; 

     while (scan!=userNumber[i]) 
     { 
      System.out.printf("Error #%s Is Unknown User", scan); 
      System.out.print("Enter User# "); 
      scan=input.nextInt(); 
     } 
     System.out.printf("%s, user# %s, has a high score of: %s", player[i], userNumber[i], highScore[i]); 

    } 
} 
+0

ので、このコード 'しばらく(スキャン!= userNumber [i])と' 'と等価であり、一方、(スキャン!= 1)'あなたが実際にあなたの**全体に入力されたユーザ番号を探すことはありません –

+0

**配列 'userNumber' –

+2

この質問はJavaScriptとは関係ありません –

答えて

0

あなたが入力した値を使用していない:
は、ここで私が持っているコードです。実際にこのようなソリューションでは、この情報を保持しているオブジェクトを1つ作成し、次にこれらのオブジェクトのListまたはarrayを作成する必要があります。

+0

ユーザーがプレーヤー#5を入力した場合、' IndexOutOfBoundsException'が表示されます。 –

+0

@KevinAndersonと彼がいなくても間違ったレコード - 今すぐ修正 –

+0

これは、順番に並んでいる。 –

0

配列の代わりにHashMapを使用することを検討する必要があります。それ以外の場合は、ユーザーが存在するかどうかを見つけるたびに配列全体をループする必要があります。

Map<Integer, Integer> userMap = new HashMap<>(); 

// map user numbers to associative array indexes. 
userMap.put(1, 0); 
userMap.put(2, 1); 
userMap.put(3, 2); 
userMap.put(4, 3); 
userMap.put(5, 4); 

player[0]= "Morpheus"; 
player[1]= "Neo"; 
player[2]= "Cereal Killer"; 
player[3]= "Crash Override"; 
player[4]= "Acid Burn"; 
highScore[0]= 853797.67; 
highScore[1]= 999999.99; 
highScore[2]= 15097.34; 
highScore[3]= 864513.16; 
highScore[4]= 543188.68; 

System.out.print("Enter User# "); 
int scan= input.nextInt(); 

// loop until the user actually exists 
while (!userMap.containsKey(scan)) 
{ 
    System.out.printf("Error #%s Is Unknown User", scan); 
    System.out.println(); 
    System.out.println("Enter User# "); 
    scan=input.nextInt(); 

} 

// get the index for the user 
int lookup = userMap.get(scan); 

System.out.printf("%s, user# %s, has a high score of: %s", player[lookup], scan, highScore[lookup]); 

このアプローチを使用すると、他の利点は、ユーザー数が順番にする必要がないということです。たとえば、次のマッピングとコードはまだ動作します

を持つことができます。

userMap.put(1, 0); 
userMap.put(2, 1); 
userMap.put(9, 2); // user # 9 can map to index 2. 
userMap.put(4, 3); 
userMap.put(5, 4); 

パーは、あなたが連想配列を使用する必要はありませんので、プレイヤーのクラスを作成することが理想的である@ScaryWombatとあなたのプログラムをより多くのOOにする。

:次に

class Player 
{ 
    private int id = 0; 
    private String name; 
    private Double score = 0.0; 

    public Player (int id, String name, double score) 
    { 
     this.id = id; 
     this.name = name; 
     this.score = score; 
    } 

    @Override 
    public String toString() 
    { 
     return String.format("%s, user# %s, has a high score of: %s", name, id, score); 
    } 
} 

は、あなたがこのようにプレイヤーを調べることができ、

Map<Integer, Player> userMap = new HashMap<>(); 

userMap.put(1, new Player(1, "Morpheus", 853797.67)); 
userMap.put(2, new Player(2, "Neo", 999999.99)); 
userMap.put(3, new Player(3, "Cereal Killer", 15097.34)); 
userMap.put(4, new Player(4, "Crash Override", 864513.16)); 
userMap.put(5, new Player(5, "Acid Burn", 543188.68)); 

今Playerに整数のHashMapを作成することができます。

// get the player object for the user id 
Player p = userMap.get(scan); 

// print out the player like this since it has a toString() 
System.out.println(p); 
+0

DV'erではなく、 'Map userMap = new HashMap <>();'のようなものが現実的になります –

+0

@ScaryWombat - trueですが、変更をできるだけ簡単にしたいw/oたくさん追加しています。 –

0

私は配列を使用する別の答えを証明しています、あなたの要件は、パラレルアレイ。コード内のすべてのコメントをご覧ください。プログラムが終了せず、無効な状態になることもないようにエラーチェックを追加しました。

ここで重要な点は、ユーザーが潜在的なユーザー番号を入力するたびにアレイ全体をループする必要があることです。

import javax.swing.JOptionPane; 

public class HighScoreSearch 
{ 
    // You need an indicator for an invalid user in the case where 
    // you don't use all array positions 
    private static final int INVALID_USER_NUM = -1; 

    public static void main(String[] args) 
    { 
     // consider renaming this int to something like userNumber (scan is not very meaningful) 
     int scan = 0; 

     int[] userNumber = new int[10]; 
     String[] player = new String[10]; 
     Double[] highScore = new Double[10]; 

     userNumber[0]= 10; 
     userNumber[1]= 777; 
     userNumber[2]= 5; 
     userNumber[3]= 1234; 
     userNumber[4]= 357; 

     // set the rest to an invalid user #; otherwise these will have a value 0 by default 
     userNumber[5]= INVALID_USER_NUM; 
     userNumber[6]= INVALID_USER_NUM; 
     userNumber[7]= INVALID_USER_NUM; 
     userNumber[8]= INVALID_USER_NUM; 
     userNumber[9]= INVALID_USER_NUM; 

     player[0]= "Morpheus"; 
     player[1]= "Neo"; 
     player[2]= "Cereal Killer"; 
     player[3]= "Crash Override"; 
     player[4]= "Acid Burn"; 

     highScore[0]= 853797.67; 
     highScore[1]= 999999.99; 
     highScore[2]= 15097.34; 
     highScore[3]= 864513.16; 
     highScore[4]= 543188.68; 

     // this represents the array index of the user across the arrays 
     int indexOfUser = 0; 

     // flag to indicate if we found a valid user 
     boolean userFound = false; 
     do 
     { 
      String replyBox = JOptionPane.showInputDialog("Enter User#"); 

      // consider trimming this replyBox value 
      // If they enter "10 " (w/o quotes would you still want that to be valid) 
      replyBox = replyBox.trim(); 

      scan = INVALID_USER_NUM; // default to an invalid user # 
      try 
      { 
       scan = Integer.parseInt(replyBox); 
      } 
      catch (java.lang.NumberFormatException nfe) 
      { 
       // they didn't enter a valid integer, but you don't want to exit the program 
      } 

      // don't bother searching if it's invalid 
      if (scan != INVALID_USER_NUM) 
      { 
       // loop through each user to see if you find the entered # 
       for (int i = 0; i < userNumber.length && !userFound; i++) 
       { 
        // we found this user 
        if (scan == userNumber[i]) 
        { 
         indexOfUser = i; 
         userFound = true; 
        } 
       } 
      } 

      if (!userFound) 
      { 
       // you should use replyBox instead of scan here 
       //String messagefalse = String.format("Error %s is an Unknown User", scan); 
       String messagefalse = String.format("Error: '%s' is an Unknown User", replyBox); 
       JOptionPane.showMessageDialog(null, messagefalse); 
      } 

     } while (!userFound); // loop until we find a user 

     // we've found a user - use the indexOfUser to index the arrays 
     String messagetrue = String.format("%s, user# %s, has a high score of: %s", player[indexOfUser], userNumber[indexOfUser], highScore[indexOfUser]); 
     JOptionPane.showMessageDialog(null, messagetrue); 
    } 
} 
関連する問題