2012-03-02 2 views
2

アレイを習得しようとしていますが、この小さな例では問題があります。誰かが私を助けてくださいできますか?あなた小さな配列で問題がある

public class Homework1{ 
public static void main(String[] args){ 
    int[] anArray={ 1,2,3,4,5,6,7,8,9}; 

    System.out.println(anArray.length); 
    int min=0; 
    int max=0; 

    for(int i=0; i<anArray.length; i++){ 
     if(anArray[i].compareTo(anArray[min]) < 0) 
      min=i; 

     if(anArray[i].compareTo(anArray[max]) > 0) 
      max=i; 
    } 

    System.out.println(max); 
    System.out.println(min); 
} 
} 

に感謝し、私はこのエラーメッセージ取得しています:

int cannot be dereferenced 
     if(anArray[i].compareTo(anArray[min]) < 0) 
int cannot be dereferenced 
     if(anArray[i].compareTo(anArray[max]) > 0) 

、ありがとうございました。

答えて

1

CompareToはPremitive型では機能しません。コンパレータ演算子を使用できます。

public class TestArray { 

public static void main(String[] args) { 
int[] anArray={ 1,2,3,4,5,6,7,8,9}; 

System.out.println(anArray.length); 
int min=0; 
int max=0; 

for(int i=0; i<anArray.length; i++){ 
    if(anArray[i] <(anArray[min])) 
     min=i; 

    if(anArray[i]>(anArray[max])) 
     max=i; 
} 

System.out.println(max); 
System.out.println(min); 
} 
} 
+0

まあ、ありがとうございます。 –

1

compareTo()を使用するには、配列Integerのリストを作成します(プリミティブではありません)int list。この行に次の行に

int[] anArray={1,2,3,4,5,6,7,8,9};

を変更 :

Integer[] anArray={1,2,3,4,5,6,7,8,9};

コンパイルエラーが表示されなくなります。

+0

彼は配列に対して 'compareTo()'を呼び出すのではなく、配列の 'int'要素を呼び出しています。 – jpm

+0

@jpm私の答えを見直してください。 – Juvanis

+0

hu!興味深いことに、私は「int」と「Integer」がまったく同じことをすると思いました。ありがとうございました。 –

2

Javaの場合、intはオブジェクトではないため、viaオペレータ(<、>、==など)との比較が行われます。 compareToを使用する場合は、Integerの配列と配列を使用する必要があります。

+0

いいコメントです、私はそれを書いています。 –

1

compareToを使用するには、intをIntegerにキャスト/ボックスする必要があるでしょう。

など。

if (((Integer)anArray[i]).compareTo(anArray[min]) < 0) 

しかし、別の回答で述べたように、あなたはおそらく、標準の演算子<を使用してint型で直接比較をしたい、>など、代わりにまったくのcompareToを使用します。

+0

よろしくお願いいたします。本当にありがとうございます。 –

3

anArray[i]のタイプはintです。 intはプリミティブ型です。つまり、実際のオブジェクトではありません。プリミティブ型でメソッド(compareTo()など)を呼び出すことはできません。

ただし、に対応する「ボクシング」タイプのIntegerタイプのメソッドを呼び出すことができます。 (ボクシングの種類は、あなたがオブジェクトとして扱う必要があるときは、プリミティブ型のラッパーとして使うタイプです。)

ただ、整数型のための定期的な比較演算子を使用します。

if (anArray[i] < anArray[min]) { 
    //... 
} 
+0

はい、まさに私が今やっていることです。ありがとうございます –

+0

プリミティブをオブジェクトとして扱う必要があるかもしれない主な理由は、ジェネリックで使用するための主な理由(例: 'ArrayList ')です。 Javaのジェネリック型システムでは、C++テンプレートとは異なりプリミティブは使用できず、ジェネリックは元の機能ではないため、プリミティブなデータ型を使用することに決めました(たとえば、数値定数は数値クラスのインスタンス例えば ​​'4'は 'FixNum'クラスのインスタンスです))。 – jpm

+0

@jpm Rubyの 'FixNum'は特別なものではありませんか?タグ付きオブジェクトハンドルとして実装されていることを思い出しているようですが、実際には「プリミティブ」値を使用しますが、インタープリタはそれらを実際のオブジェクトのように動作させるために特別に処理します。 – millimoose

1

int型がプリミティブ型で、逆参照することはできません。参照型のみ参照解除することができます。ドット(。)は逆参照演算子です。プリミティブintをオブジェクトのように扱おうとしています。 <や>や==などの比較演算子を使用して、プリミティブな整数を比較することができます。

+0

ありがとう、あなたのコメントはとても重要です、私はそれを書いています。 –

1

最小/最大値を見つけようとしていると思います。 最小/最大インデックスの値を取得すると、この場合、anArray [min]またはanArray [max]は役に立たなくなります。 これを行う正しい方法は次のとおりです。

if(anArray[i]>max) 
    max = anArray[i]; 

if(anArray[i]<min) 
    min = anArray[i]; 
+0

deferenciationは、データ型をオブジェクトとして扱うことを意味し、intはオブジェクトではなく、Integerはオブジェクトです。 –

+0

ありがとうございます。 –

関連する問題