كيف يمكنني الإعلان عن مصفوفة وتهيئتها في Java؟

StackOverflow https://stackoverflow.com/questions/1200621

  •  05-07-2019
  •  | 
  •  

سؤال

كيف يمكنني الإعلان عن مصفوفة وتهيئتها في Java؟

هل كانت مفيدة؟

المحلول

ويمكنك إما استخدام إعلان مجموعة أو مجموعة حرفية (ولكن فقط عندما تقوم بتعريف وتؤثر على المتغير على الفور، الحرفية مجموعة لا يمكن استخدامها لإعادة تعيين مجموعة).

لأنواع بدائية:

int[] myIntArray = new int[3];
int[] myIntArray = {1, 2, 3};
int[] myIntArray = new int[]{1, 2, 3};

لالطبقات، وعلى سبيل المثال String، هو نفسه:

String[] myStringArray = new String[3];
String[] myStringArray = {"a", "b", "c"};
String[] myStringArray = new String[]{"a", "b", "c"};

والطريقة الثالثة لتهيئة مفيدة عندما تقوم بتعريف مجموعة أولا ثم تهيئة ذلك. المدلى بها ضروري هنا.

String[] myStringArray;
myStringArray = new String[]{"a", "b", "c"};

نصائح أخرى

هناك نوعان من المصفوفة.

مصفوفة ذات بعد واحد

بناء جملة القيم الافتراضية:

int[] num = new int[5];

أو (الأقل تفضيلاً)

int num[] = new int[5];

بناء الجملة مع القيم المقدمة (تهيئة المتغير/الحقل):

int[] num = {1,2,3,4,5};

أو (الأقل تفضيلاً)

int num[] = {1, 2, 3, 4, 5};

ملحوظة:من أجل الراحة، يُفضل استخدام int[] num لأنه يشير بوضوح إلى أنك تتحدث هنا عن المصفوفة.وإلا فلا فرق.مُطْلَقاً.

مصفوفة متعددة الأبعاد

تصريح

int[][] num = new int[5][2];

أو

int num[][] = new int[5][2];

أو

int[] num[] = new int[5][2];

التهيئة

 num[0][0]=1;
 num[0][1]=2;
 num[1][0]=1;
 num[1][1]=2;
 num[2][0]=1;
 num[2][1]=2;
 num[3][0]=1;
 num[3][1]=2;
 num[4][0]=1;
 num[4][1]=2;

أو

 int[][] num={ {1,2}, {1,2}, {1,2}, {1,2}, {1,2} };

مصفوفة خشنة (أو مصفوفة غير مستطيلة)

 int[][] num = new int[5][];
 num[0] = new int[1];
 num[1] = new int[5];
 num[2] = new int[2];
 num[3] = new int[3];

لذلك نحن هنا نحدد الأعمدة بشكل صريح.
طريق اخر:

int[][] num={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} };

للوصول:

for (int i=0; i<(num.length); i++ ) {
    for (int j=0;j<num[i].length;j++)
        System.out.println(num[i][j]);
}

بدلاً عن ذلك:

for (int[] a : num) {
  for (int i : a) {
    System.out.println(i);
  }
}

المصفوفات الخشنة هي صفائف متعددة الأبعاد.
للحصول على شرح، انظر تفاصيل المصفوفة متعددة الأبعاد في دروس جافا الرسمية

Type[] variableName = new Type[capacity];

Type[] variableName = {comma-delimited values};



Type variableName[] = new Type[capacity]; 

Type variableName[] = {comma-delimited values};

وهو أيضا صحيح، ولكن يفضل بين قوسين بعد نوع، لأنه من الأسهل أن نرى هذا النوع المتغير هو في الواقع صفيف.

وهناك العديد من الطرق التي يمكنك تعريف صفيف في جاوة:

float floatArray[]; // Initialize later
int[] integerArray = new int[10];
String[] array = new String[] {"a", "b"};

ويمكنك العثور على مزيد من المعلومات في الشمس تعليمي الموقع و .

وفيما يلي يظهر إعلان صفيف، ولكن لم يتم تهيئة مجموعة:

 int[] myIntArray = new int[3];

وفيما يلي يظهر إعلان فضلا عن تهيئة مجموعة:

int[] myIntArray = {1,2,3};

والآن، يظهر ما يلي أيضا بالإعلان فضلا عن تهيئة مجموعة:

int[] myIntArray = new int[]{1,2,3};

ولكن هذا واحد ثالث يظهر خاصية إنشاء مجموعة وجوه مجهولة المصدر الذي أشار من قبل متغير إشارة "myIntArray"، حتى إذا نكتب فقط "الجديد كثافة العمليات [] {1،2،3}؛" ثم وهذا هو كيف يمكن إنشاء مجهول مجموعة وجوه.

إذا نكتب فقط:

int[] myIntArray;

وهذا ليس إعلان مجموعة، ولكن البيان التالي يجعل أعلاه كاملة إعلان:

myIntArray=new int[3];

وأجد أنه من المفيد إذا فهم كل جزء:

Type[] name = new Type[5];

وType[] هو نوع من متغير دعا اسم ( "اسم" يسمى <م> المعرف ). "نوع" الحرفي هو نوع قاعدة، والأقواس يعني هذا هو نوع مجموعة من تلك القاعدة. أنواع مجموعة هي في أنواع بدوره من تلقاء نفسها، والذي يسمح لك لجعل المصفوفات متعددة الأبعاد مثل Type[][] (نوع مجموعة من نوع []). يقول new الكلمة تخصيص الذاكرة لمجموعة جديدة. يقول رقم بين قوس مدى ضخامة مجموعة الجديدة ستكون ومقدار الذاكرة لتخصيص. على سبيل المثال، إذا جافا يعرف أن نوع قاعدة Type يأخذ 32 بايت، وتريد مجموعة من حجم 5، فإنه يحتاج إلى تخصيص داخليا 32 * 5 = 160 بايت.

ويمكنك أيضا إنشاء صفائف مع القيم بالفعل هناك، مثل

int[] name = {1, 2, 3, 4, 5};

والتي لا يخلق فقط المساحة الفارغة ولكن يملأ مع تلك القيم. جافا ان اقول ان الأوليات هي صحيحة وأن هناك 5 منهم، وبالتالي فإن حجم المصفوفة يمكن تحديدها بشكل ضمني.

وبدلا من ذلك،

// Either method works
String arrayName[] = new String[10];
String[] arrayName = new String[10];

وهذا تعلن مجموعة تسمى arrayName من حجم 10 (لديك عناصر من 0 إلى 9 لاستخدام).

وأيضا، في حال كنت تريد شيئا أكثر ديناميكية هناك واجهة قائمة. هذا لن تؤدي كذلك، ولكن أكثر مرونة:

List<String> listOfString = new ArrayList<String>();

listOfString.add("foo");
listOfString.add("bar");

String value = listOfString.get(0);
assertEquals( value, "foo" );

وهناك طريقتان رئيسيتان لجعل صفيف:

وهذا واحد، لمجموعة فارغة:

int[] array = new int[n]; // "n" being the number of spaces to allocate in the array

وهذا واحد، لمجموعة تهيئته:

int[] array = {1,2,3,4 ...};

ويمكنك أيضا جعل المصفوفات متعددة الأبعاد، مثل هذا:

int[][] array2d = new int[x][y]; // "x" and "y" specify the dimensions
int[][] array2d = { {1,2,3 ...}, {4,5,6 ...} ...};

وخذ نوع int بدائية على سبيل المثال. هناك عدة طرق لإعلان ومجموعة int:

int[] i = new int[capacity];
int[] i = new int[] {value1, value2, value3, etc};
int[] i = {value1, value2, value3, etc};

وحيث في كل من هذه، يمكنك استخدام int i[] بدلا من int[] i.

ومع التفكير، يمكنك استخدام (Type[]) Array.newInstance(Type.class, capacity);

لاحظ أنه في معلمات الأسلوب، ... يشير variable arguments. أساسا، أي عدد من المعلمات على ما يرام. انه من الاسهل لشرح مع رمز:

public static void varargs(int fixed1, String fixed2, int... varargs) {...}
...
varargs(0, "", 100); // fixed1 = 0, fixed2 = "", varargs = {100}
varargs(0, "", 100, 200); // fixed1 = 0, fixed2 = "", varargs = {100, 200};

داخل الأسلوب، يتم التعامل varargs باعتباره int[] وضعها الطبيعي. لا يمكن إلا أن Type... استخدامها في معلمات الأسلوب، لذلك سوف int... i = new int[] {} لا ترجمة.

لاحظ أنه عند تمرير int[] إلى طريقة (أو أي Type[] غيرها)، لا يمكنك استخدام الطريقة الثالثة. في int[] i = *{a, b, c, d, etc}* بيان، يفترض المترجم أن {...} يعني int[]. ولكن هذا هو لأنك إعلان متغير. عند تمرير صفيف إلى الأسلوب، يجب إعلان إما أن يكون new Type[capacity] أو new Type[] {...}.

تحليل متعددة الأبعاد صالحة

والمصفوفات متعددة الأبعاد هي أصعب بكثير للتعامل معها. أساسا، مجموعة 2D هي مجموعة من المصفوفات. int[][] يعني مجموعة من int[]s. والمفتاح هو أنه إذا أعلنت عن int[][] كما int[x][y]، والحد الأقصى هو مؤشر i[x-1][y-1]. أساسا، وهو int[3][5] مستطيلة هو:

[0, 0] [1, 0] [2, 0]
[0, 1] [1, 1] [2, 1]
[0, 2] [1, 2] [2, 2]
[0, 3] [1, 3] [2, 3]
[0, 4] [1, 4] [2, 4]

إذا كنت ترغب في إنشاء المصفوفات باستخدام انعكاسات ثم يمكنك القيام به مثل هذا:

 int size = 3;
 int[] intArray = (int[]) Array.newInstance(int.class, size ); 

وإعلان مجموعة من المراجع وجوه:

class Animal {}

class Horse extends Animal {
    public static void main(String[] args) {

        /*
         * Array of Animal can hold Animal and Horse (all subtypes of Animal allowed)
         */
        Animal[] a1 = new Animal[10];
        a1[0] = new Animal();
        a1[1] = new Horse();

        /*
         * Array of Animal can hold Animal and Horse and all subtype of Horse
         */
        Animal[] a2 = new Horse[10];
        a2[0] = new Animal();
        a2[1] = new Horse();

        /*
         * Array of Horse can hold only Horse and its subtype (if any) and not
           allowed supertype of Horse nor other subtype of Animal.
         */
        Horse[] h1 = new Horse[10];
        h1[0] = new Animal(); // Not allowed
        h1[1] = new Horse();

        /*
         * This can not be declared.
         */
        Horse[] h2 = new Animal[10]; // Not allowed
    }
}

في جاوة 9

<ع> استخدام مختلف <لأ href = "https://docs.oracle.com/javase/9/docs/api/java/util/stream/IntStream.html#iterate-int-java.util.function.IntPredicate- java.util.function.IntUnaryOperator- "يختلط =" نوفولو noreferrer "> IntStream.iterate و <لأ href =" https://docs.oracle.com/javase/9/docs/api/java/util/stream /IntStream.html#takeWhile-java.util.function.IntPredicate- "يختلط =" نوفولو noreferrer "> طرق IntStream.takeWhile :

int[] a = IntStream.iterate(10, x -> x <= 100, x -> x + 10).toArray();

Out: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]


int[] b = IntStream.iterate(0, x -> x + 1).takeWhile(x -> x < 10).toArray();

Out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

في جاوة 10

واستخدام المحلي متغير نوع الاستدلال :

var letters = new String[]{"A", "B", "C"};

وصفيف هي قائمة متسلسلة من البنود

int item = value;

int [] one_dimensional_array = { value, value, value, .., value };

int [][] two_dimensional_array =
{
  { value, value, value, .. value },
  { value, value, value, .. value },
    ..     ..     ..        ..
  { value, value, value, .. value }
};

إذا انها كائن، ثم انها نفس مفهوم

Object item = new Object();

Object [] one_dimensional_array = { new Object(), new Object(), .. new Object() };

Object [][] two_dimensional_array =
{
  { new Object(), new Object(), .. new Object() },
  { new Object(), new Object(), .. new Object() },
    ..            ..               ..
  { new Object(), new Object(), .. new Object() }
};

في حالة من الكائنات، تحتاج إلى إما إسناد ذلك إلى null تهيئة لهم باستخدام new Type(..)، والطبقات مثل String وInteger هي الحالات الخاصة التي سيتم التعامل معها على النحو التالي

String [] a = { "hello", "world" };
// is equivalent to
String [] a = { new String({'h','e','l','l','o'}), new String({'w','o','r','l','d'}) };

Integer [] b = { 1234, 5678 };
// is equivalent to
Integer [] b = { new Integer(1234), new Integer(5678) };

في عام يمكنك إنشاء صفائف هذا M الأبعاد

int [][]..[] array =
//  ^ M times [] brackets

    {{..{
//  ^ M times { bracket

//            this is array[0][0]..[0]
//                         ^ M times [0]

    }}..}
//  ^ M times } bracket
;

ومن الجدير أن نلاحظ أن خلق مجموعة M الأبعاد غير مكلفة من حيث الفضاء. منذ متى تقوم بإنشاء مجموعة الأبعاد M مع N على جميع الأبعاد، والحجم الإجمالي للمجموعة أكبر من N^M، لأن كل مجموعة لديها مرجعية، وفي M-البعد هو هناك (M-1) مجموعة الابعاد المراجع. الحجم الإجمالي هو على النحو التالي

Space = N^M + N^(M-1) + N^(M-2) + .. + N^0
//      ^                              ^ array reference
//      ^ actual data

لخلق صفائف كائنات من الدرجة يمكنك استخدام java.util.ArrayList. لتعريف صفيف:

public ArrayList<ClassName> arrayName;
arrayName = new ArrayList<ClassName>();

وتعيين القيم إلى مجموعة:

arrayName.add(new ClassName(class parameters go here);

وقراءة من مجموعة:

ClassName variableName = arrayName.get(index);

ملاحظة:

وvariableName هو إشارة إلى مجموعة وهذا يعني أن التلاعب variableName والتلاعب arrayName

وعن الحلقات:

//repeats for every value in the array
for (ClassName variableName : arrayName){
}
//Note that using this for loop prevents you from editing arrayName

وللحلقة التي تسمح لك لتحرير arrayName (التقليدية لحلقة):

for (int i = 0; i < arrayName.size(); i++){
    //manipulate array here
}

في جاوة 8 يمكنك استخدام مثل هذا.

String[] strs = IntStream.range(0, 15)  // 15 is the size
    .mapToObj(i -> Integer.toString(i))
    .toArray(String[]::new);

ونعلن وتهيئة لجاوا 8 و في وقت لاحق. إنشاء عدد صحيح مجموعة بسيطة:

int [] a1 = IntStream.range(1, 20).toArray();
System.out.println(Arrays.toString(a1));
// Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

وإنشاء مجموعة عشوائية صحيحة بين [-50، 50] والزوجي [0، 1E17]:

int [] a2 = new Random().ints(15, -50, 50).toArray();
double [] a3 = new Random().doubles(5, 0, 1e17).toArray();

والطاقة لطفلين تسلسل:

double [] a4 = LongStream.range(0, 7).mapToDouble(i -> Math.pow(2, i)).toArray();
System.out.println(Arrays.toString(a4));
// Output: [1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0]

لسلسلة [] يجب تحديد المنشئ:

String [] a5 = Stream.generate(()->"I will not squeak chalk").limit(5).toArray(String[]::new);
System.out.println(Arrays.toString(a5));

والمصفوفات متعددة الأبعاد:

String [][] a6 = List.of(new String[]{"a", "b", "c"} , new String[]{"d", "e", "f", "g"})
    .toArray(new String[0][]);
System.out.println(Arrays.deepToString(a6));
// Output: [[a, b, c], [d, e, f, g]]

ويمكنك أيضا أن تفعل ذلك مع java.util.Arrays:

List<String> number = Arrays.asList("1", "2", "3");

Out: ["1", "2", "3"]

وهذا هو واحد كبير على بسيط و واضحة. لم أكن أرى في إجابات أخرى حتى ظننت أنني يمكن إضافته.

وهناك طريقة أخرى ليعلن وتهيئة ArrayList:

private List<String> list = new ArrayList<String>(){{
    add("e1");
    add("e2");
}};

ومع المحلي نوع متغير الاستدلال لديك فقط لتحديد نوع واحد:

var values = new int[] { 1, 2, 3 };

أو

int[] values = { 1, 2, 3 }

الكثير من الإجابات هنا.إضافة بعض الطرق الصعبة لإنشاء المصفوفات (من ملف امتحان وجهة نظر من الجيد أن نعرف هذا)

  1. إعلان وتحديد مجموعة

    int intArray[] = new int[3];
    

سيؤدي هذا إلى إنشاء مجموعة من الطول 3.لأنه يحمل النوع البدائي في جميع القيم المعينة على 0 افتراضيًا. على سبيل المثال

    intArray[2]; // will return 0
  1. استخدام الأقواس المربعة [] قبل اسم المتغير

    int[] intArray = new int[3];
    intArray[0] = 1;  // array content now {1,0,0}
    
  2. تهيئة البيانات وتوفيرها للصفيف

    int[] intArray = new int[]{1,2,3};
    

    هذه المرة لا حاجة لذكر الحجم في قوس الصندوق.حتى البديل البسيط لهذا هو

    int[] intArray = {1,2,3,4};
    
  3. مجموعة من الطول 0

    int[] intArray = new int[0];
    int length = intArray.length; // will return length 0
    

    مماثلة للمصفوفات متعددة الأبعاد

    int intArray[][] = new int[2][3]; 
    // This will create an array of length 2 and 
    //each element contains another array of length 3.
    // { {0,0,0},{0,0,0} } 
    int lenght1 = intArray.length; // will return 2
    int length2 = intArray[0].length; // will return 3
    

    استخدام الأقواس المربعة قبل المتغير

    int[][] intArray = new int[2][3];
    

    إنه أمر جيد تمامًا إذا وضعت قوسًا واحدًا في النهاية

    int[] intArray [] = new int[2][4];
    int[] intArray[][] = new int[2][3][4]
    

بعض الأمثلة

    int [] intArray [] = new int[][] {{1,2,3},{4,5,6}};
    int [] intArray1 [] = new int[][] {new int[] {1,2,3}, new int [] {4,5,6}};
    int [] intArray2 [] = new int[][] {new int[] {1,2,3},{4,5,6}} 
    // All the 3 arrays assignments are valid
    //Array looks like {{1,2,3},{4,5,6}}

ليس من الضروري أن يكون كل عنصر داخلي بنفس الحجم.

    int [][] intArray = new int[2][];
    intArray[0] = {1,2,3};
    intArray[1] = {4,5};
    //array looks like {{1,2,3},{4,5}}

    int[][] intArray = new int[][2] ; // this won't compile keep this in mind.

يجب عليك التأكد إذا كنت تستخدم بناء الجملة أعلاه، فيجب عليك تحديد الاتجاه الأمامي بين قوسين مربعين. وإلا فلن يتم تجميعه.بعض الأمثلة :

    int [][][] intArray = new int[1][][];
    int [][][] intArray = new int[1][2][];
    int [][][] intArray = new int[1][2][3]; 

ميزة أخرى مهمة هي متغير

    Number[] numArray = {1,2,3,4};   // java.lang.Number
    numArray[0] = new Float(1.5f);   // java.lang.Float
    numArray[1] = new Integer(1);    // java.lang.Integer
   //You can store a subclass object in an array that is declared
   // to be of the type of its superclass. 
   // Here Number is the superclass for both Float and Integer.

   Number num[] = new Float[5]; // this is also valid

عفريت :بالنسبة للأنواع المشار إليها، تكون القيمة الافتراضية المخزنة في المصفوفة فارغة.

الإعلان عن المصفوفة: int[] arr;

تهيئة المصفوفة: int[] arr = new int[10]; يمثل الرقم 10 عدد العناصر المسموح بها في المصفوفة

تعريف المصفوفة متعددة الأبعاد: int[][] arr;

تهيئة المصفوفة متعددة الأبعاد: int[][] arr = new int[10][17]; 10 صفوف و17 عمودًا و170 عنصرًا، لأن 10 في 17 يساوي 170.

تهيئة المصفوفة تعني تحديد حجمها.

int[] SingleDimensionalArray = new int[2]

int[][] MultiDimensionalArray = new int[3][4]
scroll top