2010-12-11 1 views
0

文字の完全な行を読み取るために使用したいメソッドに問題があります。readCharArray()メソッドが機能していません

私は私の方法については、以下のパッケージを使用していますまず第一に:

package chararray; 

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

public class Console 
{ 
private static Scanner sc; 
private Console() 
{ 

} 

public static char[] readCharArray() 
    throws NoSuchElementException, IllegalStateException 
{ 
    sc = new Scanner(System.in); 
    String text = sc.nextLine(); 
    return text.toCharArray(); 
} 

} 


そして、それは私がパッケージを含んでメインのコードです。私のコンパイラ(BlueJ)が私に言っている: "互換性のない型 - 見つかったchar []しかし期待されたchar"。しかし、通常、私のメソッドはchar []のために働くはずですか?私がここで間違っていることは何ですか?この行で

import chararray.Console; 

public class kundenverwaltung 
{ 
    public static void main (String args[]) 
    { 
     int nk; 

     System.out.print("Wie viele Kunden möchten Sie erfassen?: "); 
     nk = Console.readInt(); 

     char [][] kundenregister; 
     kundenregister = new char [nk][4]; 

     for (int i = 0; i < nk; ++i) 

     { 
      System.out.print("Kundennummer: "); 
      kundenregister [i][0] = Console.readCharArray(); 

      System.out.print("Name des Kunden: "); 
      kundenregister [i][1] = Console.readCharArray(); 

      System.out.print("Vorname des Kunden: "); 
      kundenregister [i][2] = Console.readCharArray(); 

      System.out.print("Adresse des Kunden: "); 
      kundenregister [i][3] = Console.readCharArray(); 

     }  

    } 

} 

答えて

2

ルック - ないchar配列

kundenregister[i][0] = Console.readCharArray(); 

発現kundenregister[i][0]char変数を指します。

それはあなたが何をしようとしては明らかではありません - 特にあなたはchar型の配列としてではなく文字列として値を必要とする理由 - しかし、これはそれを動作させるでしょう:

3次元を持つ
char[][][] kundenregister = new char[nk][4][]; 

配列はほぼ常に間違いです。私はを強くはあなたのコードをリファクタリングすることを示唆している:番号、名前、最初の名前のプロパティを型に

  • 使用した文字列の代わりに、char配列
  • 4つの値をカプセル化するとアドレス
  • List<Customer>などを作成してください。具体的にはArrayList<T>を実装として使用します。次に、あなたはあらかじめ顧客の数を知る必要はありません...ユーザーは、彼らが完了したことを示すためにリターン(または何でも)を押すことができます。
+0

@Ordo:文字列を使用しても、文字列の個々の文字や領域にアクセスするには、 'substring()'や 'charAt'などのメソッドを使用できます。 –

+0

はい、これは私がコマンドラインから人の名前、住所などを読んで、クラスを作成し、Stringsを使うことが絶対に重要だと思っているのを見てからです。ここではchar配列では動作しません。 –

+0

ありがとうございます。私はちょうどストリングを使用しており、それは動作します。 – Ordo

1

変数kundenregisterは、文字の配列の配列として宣言されています。これは、各xとyについて、kundenregister[x][y]の単一文字(x番目の文字の配列のy番目の文字)であることを意味します。しかし、文字列全体に割り当てようとしています。

あなたの目標がここにあるかどうかわかりませんので、簡単に修正することはできません。結果をkundenregisterのインデックスに割り当てるか、kundenregisterを3次元配列として宣言します。

+0

ああ、分かります。だから私は "kundenregister"を3次元配列として宣言しなければならない。 – Ordo

+2

@Ordo:多分。それはあなたのコンパイルの問題を解決するでしょうが、あなたが達成しようとしていることやコードがするべきことがはっきりしないので、それが適切かどうかは言えません。 –

+0

私は各 "顧客"のためにデータセットを保存したいと思います。顧客番号、顧客名などを含む。私の提案は、2次元配列kundenregister [i] [j]を作成し、各顧客[i]の第2次元[0,1,2 .. j]のデータセットを格納することでした。しかし、私が保存したいデータは複数の文字を持っているので、それを格納するために3次元を使わなければならないかのように見えます。別の「スマート」な可能性はありますか? – Ordo

1

あなたがここで何をしようとしているのか正確にはわからないので、完全な解決策を提供することはできませんが、エラーの原因となる直接的な問題は、kundenverwaltungクラスのforループです。

あなたは)型の不一致がConsole.readCharArray(以降発生する場所である、kundenregister[i][0]にConsole.readCharArrayを()を割り当てるしようとしているがchar[]を返し、kundenregister[i][0]はタイプcharです。

これを理解するのに役立ちます:kundenregisterは本質的に2dグリッドで、各スロットは1つの文字です。kundenregister[i][0]はそのスロットの1つを指しているので、kundenregister[i][2] = xと書くと、xはcharでなければなりません。それ以外の場合は動作しません。