2016-10-07 7 views
-5

配列に関する質問があります。 未知のサイズの配列を含むオブジェクト(A)があり、配列サイズにアクセスできないとします;これは返し(最後の要素の後)この配列のサイズを知る方法

  • 完全
  • 追加
  • 削除(最後の要素:またはアレイ自体が、しかし、私は、オブジェクトAに以下の方法を適用することができ削除された要素)

配列のサイズはどのように知ることができますか?

+0

[Oracleのチュートリアルの配列](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html) – Turing85

+0

これは宿題に関する質問です。おそらくremoveメソッドを何回呼び出すことができるかをテストできます。 –

+0

クラスにメソッドを書き込むことで、メソッドが配列にアクセスできるようにします。次に、array(array.length)のサイズを返します –

答えて

2

最初の呼び出し配列がいっぱいになるまで、このように、その後、削除して、配列が空になるまで削除した回数を数え、あなたのサイズを持って、追加します。

SomeArray a = ... 
    SomeThingThatArrayCanStore something = ...; 

    while (!a.full()) { 
     a.add(something); 
    } 

    int size = 0; 

    while (!a.empty()) { 
     a.remove() 
     size++; 
    } 

    // here you have the size 
+0

入力配列を最初にクローンして、処理中に破棄しないようにする必要があります。 –

+0

素晴らしいですが、私は配列の要素を失います! – user6162628

+0

これは唯一の解決策です。remove()が削除された要素を返す場合は、それを他の配列に格納し、サイズを知ってからそれらをすべて追加してください(この時点で配列は空です) –

1

あなたはfullは必要ありません。それは赤いニシンです。

これは、明示的に一時的なコンテナを作成せずにこれを実現するソリューションです。基本的には、スタックフレームを使用して削除された要素のコンテナを作成しています。

Aが配列の種類、およびaインスタンスであり、かつremove()機能が削除オブジェクトを返した場合、あなたがゼロにnセットで最初にそれを呼び出す場合は、

int size(int n, A a){  
    if (a.empty()){ 
     return n; // all done, n holds the number of elements removed 
    } 
    Object o = a.remove(); // pop the element 
    int ret = size(n + 1, a); // call self with the array truncated 
    a.add(o); // push the element back 
    return ret; 
} 

、一つの方法です。それはスタックフレームの作成に関しては荒々しく高価ですが、それには奇妙な優雅さがあります。

+0

ここでは、配列内にいくつの要素があるか知っていますが、配列自体のサイズ(格納できる要素の数)ではありません。 –

0

リフレクションで楽しいものを試してください。リフレクションでは、プライベートフィールドと未知フィールドにアクセスできます。それは暗い魔法のようなものです:強力ですが危険です!

import java.lang.reflect.Array; 
import java.lang.reflect.Field; 
import java.util.List; 

public class ArrayFinder { 

    public void printAllArraysLength(A a) throws IllegalArgumentException, IllegalAccessException { 
     for (Field field : A.class.getDeclaredFields()) {  // get all private fields 
      field.setAccessible(true);  // private are now public ! 
      Object array = field.get(a); // get the field content. 
      try{ 
       System.out.println(field.getName() + " length : " + getArrayLenth(array)); 
      }catch(Exception e){ 
       System.out.println(field.getName() + " is not an array"); 
      } 
     } 
    } 

    private int getArrayLenth(Object array) { 
     Class arrayClass = array.getClass().getComponentType(); 
     if(arrayClass == null){ 
      // no component type, maybe a list. 
      return ((List) array).size(); 
     } 
     else { 
      if (arrayClass.isPrimitive()) { 
       return Array.getLength(array); 
      }else{ 
       return ((Object[]) array).length; 
      } 
     } 
    } 
} 

[OK]を教師が追加/削除/空といっしょにあなたが期待するものではありません。

関連する問題