配列に関する質問があります。 未知のサイズの配列を含むオブジェクト(A)があり、配列サイズにアクセスできないとします;これは返し(最後の要素の後)この配列のサイズを知る方法
- 空
- 完全
- 追加
- 削除(最後の要素:またはアレイ自体が、しかし、私は、オブジェクトAに以下の方法を適用することができ削除された要素)
配列のサイズはどのように知ることができますか?
配列に関する質問があります。 未知のサイズの配列を含むオブジェクト(A)があり、配列サイズにアクセスできないとします;これは返し(最後の要素の後)この配列のサイズを知る方法
配列のサイズはどのように知ることができますか?
最初の呼び出し配列がいっぱいになるまで、このように、その後、削除して、配列が空になるまで削除した回数を数え、あなたのサイズを持って、追加します。
SomeArray a = ...
SomeThingThatArrayCanStore something = ...;
while (!a.full()) {
a.add(something);
}
int size = 0;
while (!a.empty()) {
a.remove()
size++;
}
// here you have the size
入力配列を最初にクローンして、処理中に破棄しないようにする必要があります。 –
素晴らしいですが、私は配列の要素を失います! – user6162628
これは唯一の解決策です。remove()が削除された要素を返す場合は、それを他の配列に格納し、サイズを知ってからそれらをすべて追加してください(この時点で配列は空です) –
あなたは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;
}
、一つの方法です。それはスタックフレームの作成に関しては荒々しく高価ですが、それには奇妙な優雅さがあります。
ここでは、配列内にいくつの要素があるか知っていますが、配列自体のサイズ(格納できる要素の数)ではありません。 –
リフレクションで楽しいものを試してください。リフレクションでは、プライベートフィールドと未知フィールドにアクセスできます。それは暗い魔法のようなものです:強力ですが危険です!
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]を教師が追加/削除/空といっしょにあなたが期待するものではありません。
[Oracleのチュートリアルの配列](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html) – Turing85
これは宿題に関する質問です。おそらくremoveメソッドを何回呼び出すことができるかをテストできます。 –
クラスにメソッドを書き込むことで、メソッドが配列にアクセスできるようにします。次に、array(array.length)のサイズを返します –