2011-07-12 27 views
10

Diziler için alıcılar ve ayarlayıcılar hakkında birkaç sorum var. Biz onun kurucu bir dizinin özel kopyasını yapar böyle bir sınıf, olduğunu varsayalım: Biz diziyi istiyoruzDiziler için alıcılar ve ayarlayıcılar

import java.util.Arrays; 

public class Foo 
{ 
    private int[] array; 

    public Foo(int[] array) { 
     this.array = Arrays.copyOf(array, array.length); 
    } 
} 

sadece erişilebilir/Alıcı ve ayarlayıcıların yoluyla mutasyona uğramış. Biz kullanıcı doğrudan dizinin elemanlarını değiştirmek için izin veren bir başvuru dönüyoruz gibi gaz giderici amacı yendi

public int[] getArray() { 
    return array; 
} 

: Biz şuna benzer bir alıcı varsa. Örneğin. belirleyiciler için Benzer

public int getElement(int index) { 
    return array[index]; 
} 

:

Foo foo = new Foo(someArray); 
... 
int[] bar = foo.getArray(); 
bar[0] = 123; // Now foo.array[0] = 123 and we haven't used a setter! 

Yani muhtemelen böyle bir şey gerekiyor. ,

public int getArrayLength() { 
    return array.length; 
} 

Bu zaten 1-boyutlu bir dizi için biraz dağınık: Biz başına elemanı bazında şeyler yapıyoruz Ama eğer, biz de boyunu almanın bir araç sağlamak için ihtiyacımız olacak Bu tür önemsiz bir görev için bir sürü kod olduğunu ve daha da önemlisi aslında kullanmak için bir karmaşa

import java.util.Arrays; 

public class Foo 
{ 
    private int[][][] array; 

    public Foo(int[][][] array) { 
     // Code for making a deep copy here 
    } 

    public int getElement(int i, int j, int k) { 
     return array[i][j][k]; 
    } 

    public void setElement(int i, int j, int k, int value) { 
     array[i][j][k] = value; 
    } 

    public int getArrayLength() { 
     return array.length; 
    } 

    public int getArrayLength(int i) { 
     return array[i].length; 
    } 

    public int getArrayLength(int i, int j) { 
     return array[i][j].length; 
    } 
} 

: ama bunun yerine çok boyutlu bir dizi olduğunu varsayalım. Gerçekten böyle bir şeyle sonuçlanmak zorunda mıyız yoksa daha iyi bir yolu var mı? Her yere baktım ve bunun için bir "standart pratik" görünmüyor.

+0

Listelere baktınız mı? – Jacob

+1

Diziler çok 1900'dür. – Marcelo

cevap

7

bir çok boyutlu dizi de 1 boyutlu bir dizidir: int[a][b][c] gerçekten sadece int[a*b*c], bu nedenle sorun, nasıl erişim güvenle sağlıyorsunuz aşağı kaynar? Bunun gibi:

İşte bu kadar.

Arayanlar dizinin güvenli bir kopyasına sahiptir ve dizinin normal bir şekilde kullanılmasını sağlar. Yetkilendirme yöntemlerine gerek yoktur.

1

ArrayList veya Vector önce ne düşünüyorsunuz?

Daha iyi bir soru, bu noktada, Foo'un neden bir dizi tarafından desteklendiğini açığa çıkardığını düşünüyorum. Kapsamaya çalışıyorsanız, her yerde erişim sağlayıcılara ve ayarlayıcılara sahip olmanıza gerek yoktur. Dizinin etrafında bir sınıf sarıcı oluşturmaya çalışıyorsanız, bir arabiriminiz olduğunu önerebilirim, IntList veya bir şey olarak adlandırın ve Foo'u liste tarafından desteklenen somut bir uygulama haline getirin.

1

İlk bölümle ilgili olarak, alıcınız yapıcı gibi görünmeyebilir mi?

public int[] getArray() { 
    return Arrays.copyOf(array, array.length); 
} 
0

Çok boyutlu genel diziler için küçük bir API yazdım. Boyutlarınız ne olursa olsun, her eleman için ayarlayıcılar, ayarlayıcılarınız var.İşte

MDDAJ on github

bir örnektir: 5 boyutlu dize dizisi oluşturulması:

MDDAPseudo<String> c = new MDDAPseudo<String>(10,20,5,8,15); 
c.set("xyz", 0,0,2,1,0); // setter indices: [0][0][2][1][0] 
String s = c.get(0,0,0,0,0); // getter indices [0][0][0][0][0] 

Bohemian zaten sadece tek bir boyutu kullanabilirsiniz yazdı. Bu durumda PDDAPSeudo iç sınıfının da bir boyutu vardır. Ancak API size çok boyutlu bir dizi gibi erişim sağlar

İlgili konular