2016-10-22 14 views
0

私のプログラムは25のサイズの文字列配列で構成されています。私がしようとしているのは、これに要素を追加するaddメソッドを作成することです配列同じ文字列を追加しようとすると、特定のアイテムがString配列内にリストされている回数を表示するメソッドを作成します(これを行うためにハッシュマップを使用します)。プログラムは計画どおりに機能していません。新しいメソッドを追加すると、配列の次のインデックスにインクリメントするのではなく、インデックス0で再開するので(addメソッドi = 0を呼び出すたびに意味があります) 。何かが追加されたら次のインデックスに行くためにこのメソッドを変更するために私は何ができますか?ありがとう、以下のコードを参照してください:私のプログラムでちょっとした問題に遭遇しました(ArrayListは使えません)

import java.util.*; 

public class Assignment1 { 




     public static void main(String[] args){ 
      new Assignment1(); 
     } 

     // This will act as our program switchboard 
     public Assignment1(){ 
      Scanner input = new Scanner(System.in); 
      String[] flowerPack = new String[25]; 
      int[] flowerCount = new int[25]; 
      System.out.println("Welcome to my flower pack interface."); 
      System.out.println("Please select a number from the options below"); 
      System.out.println(""); 

      while(true){ 
       // Give the user a list of their options 
       System.out.println("1: Add an item to the pack."); 
       System.out.println("2: Remove an item from the pack."); 
       System.out.println("3: Sort the contents of the pack."); 
       System.out.println("4: Search for a flower."); 
       System.out.println("5: Display the flowers in the pack."); 
       System.out.println("0: Exit the flower pack interfact."); 

       // Get the user input 
       int userChoice = input.nextInt(); 

       switch(userChoice){ 
        case 1: 
         addFlower(flowerPack); 
         break; 
        case 2: 
         removeFlower(flowerPack); 
         break; 
        case 3: 
         sortFlowers(flowerPack); 
         break; 
        case 4: 
         searchFlowers(flowerPack); 
         break; 
        case 5: 
         displayFlowers(flowerPack); 
         break; 
        case 0: 
         System.out.println("Thank you for using the flower pack interface. See you again soon!"); 
         System.exit(0); 
       } 
      } 

     } 

     private void addFlower(String flowerPack[]) { 
      // TODO: Add a flower that is specified by the user 
      int i = 0; 

      String flowerName; 
      Scanner flowerInput = new Scanner(System.in); 

      System.out.println("Please enter the name of a flower type to add:"); 
      flowerName = flowerInput.nextLine(); 
      flowerPack[i] = flowerName; 
      i++; 

     } 

     private void removeFlower(String flowerPack[]) { 
      // TODO: Remove a flower that is specified by the user 
      String flowerName; 
      Scanner flowerInput = new Scanner(System.in); 
      System.out.println("Please enter the name of a flower type to remove"); 
      flowerName = flowerInput.nextLine(); 

      for (int i = 0; i < flowerPack.length; i++) { 
       if (flowerPack[i].equals(flowerName)) { 
        flowerPack[i] = ""; //Will ask professor if we should set to NULL instead 
       } 
      } 
     } 

     private void sortFlowers(String flowerPack[]) { 
      // TODO: Sort the flowers in the pack (No need to display them here) - Use Selection or Insertion sorts 
      // NOTE: Special care is needed when dealing with strings! research the compareTo() method with strings 

      Arrays.sort(flowerPack); 
     } 

     private void searchFlowers(String flowerPack[]) { 
      // TODO: Search for a user specified flower 
      String flowerType; 
      Scanner flowerInput = new Scanner(System.in); 
      System.out.println("Please enter the name of a flower to search for:"); 
      flowerType = flowerInput.nextLine(); 

      for (int i = 0; i < flowerPack.length; i++) { //done in O(n) time This is a linear search 
       if (flowerPack[i].equals(flowerType)) { 
        System.out.println("Found your flower " + flowerPack[i]); 
        break; 
       } else { 
        System.out.println("Invalid flower type!"); 
        break; 
       } 
      } 
     } 

     private void displayFlowers(String flowerPack[]) { 
      // TODO: Display only the unique flowers along with a count of any duplicates 
      /* 
      * For example it should say 
      * Roses - 7 
      * Daffodils - 3 
      * Violets - 5 
      */ 

      Map<String,Integer> theFlowers = new HashMap<String, Integer>(); 

      for(int i=0;i<flowerPack.length;i++){ 

       if(theFlowers.get(flowerPack[i])==null){ 
        theFlowers.put(flowerPack[i],1); 
       }else{ 
        theFlowers.put(flowerPack[i], theFlowers.get(flowerPack[i])+1); 
       } 
      } 
      System.out.println(theFlowers); 

     } 



} 
+1

コードレビュー項目:あまりにも多くの 'Scanner'オブジェクトは必要ありません。すべてのメソッドが 'System.in'から読み込んでいるので、単一のインスタンスを使用してすべてのメソッド間で共有することができます。 –

+0

LOL true、少し冗長です。コードレビューをありがとう。 – Linuxn00b

答えて

2

最大25個の花を追加して停止しますか、または26番目の花が追加されたときに最初の文字列を上書きしますか?

最大25個の花だけを追加したい場合は、最初の位置に新しい文字列を追加し、空の文字列を配列内に追加するのが最も簡単です。あなたは(25日花はあなたが最初の配列要素を上書き追加された後)アレイ上で回転させたい場合は

flowerName = flowerInput.nextLine(); 
for(int i=0; i<flowerPack.length; i++){ 
    if(flowerPack[i] == null || flowerPack[i].equalsIgnoreCase("")){ 
     flowerPack[i] = flowerName; 
     break; 
    } 
} 

よう 何かは、あなたがflowernameを追加するには、次のインデックスを覚えておく必要があります。 インデックスはクラス変数にすることができます(クラス変数を使用する場合は 'i'と呼びます)。

編集:追加されたflowerPack [i]! = nullの

(コードがテストされ、最も可能性の高い、まだエラーが含まれています)

編集2:花の名前のみのアレイ内の一箇所に保存されているので、休憩を追加しました。

+0

問題は、ここではスイッチケース構造を使用していることです。アイテムを追加してスイッチケースに戻って別の選択肢を作って、何か他のものをもう一度加えるために戻ってくることができるようにしたい。 forループを使うと、最後の要素に達するまで繰り返しループします。 – Linuxn00b

+1

@ Linuxn00b forループはaddメソッドの内側にある必要があります。したがって、実行後にスイッチケース構造体に戻ります。また、ループが最後の要素に到達するまでループがループしていて、ループ内のヌル/空白の位置が(1つの位置だけではなく)すべてのヌル/空の位置を上書きします。通常、ループは配列内のすべての要素に対して実行され、要素が空であるかどうか調べ、要素が空の場合は新しい花を追加します。このコードの「問題」は、25個の花を追加することができます。その後、新しい花を追加する前に削除する必要があります。 –

+0

ありがとうございます。これを試してみましょう – Linuxn00b

0

あなたは配列内のアイテムの数を知る必要があります。その番号を使用して、使用する索引を確認します。

+1

配列には.size()メソッドがありません。それらは.length属性を持ちます。また、arraylengthは25に設定されているので、flowerPack.lengthは常に25を返します。 –

+0

正しいと思われるので、.size()メソッドを使用しないと、配列内で使用されている要素の数がわかります。これを行う1つの方法は、クラスに要素を追加するたびに増加する別の変数を持たせることです。変数を使用して、次の要素が何であるかを知ることができます。 –

+0

次に、配列から花が削除されたときに、removeメソッドで変数を減らします。 –

0

あなたの問題について - ごaddFlower(...)メソッドの内部では、新しいローカル変数にメソッドが呼び出されるたびに作成され、変数はに対してローカルであるため、この方法ではi++は無意味であるあなた言い換えれば0にその値を設定しますint i = 0;を持っていますメソッドを呼び出すたびにメソッドとリセットを行います。変数の詳細については、this tutorialを参照してください。

アイテムを追加する最も簡単な方法は、空/無効と思われる最初のポジションを見つけて、そのポジションに新しいアイテムを配置するという点で「Mein Name」の回答に同意します。

クラスメンバー変数を使用して配列内のアイテムの現在の数を把握することにした場合、アイテムを削除するときにその変数を減らす必要があります。

関連する問題