مرحبًا! في هذه المقالة، سننظر في كيفية تحويل قائمة العناصر إلى مصفوفة من العناصر في Java. في الواقع، لا توجد طرق كثيرة للقيام بذلك، وكلها بسيطة، لذلك لن تكون المقالة معقدة. دعونا نقرر على الفور ما الذي نعمل معه. سنقوم بتحويل القوائم إلى مصفوفات، وبشكل أكثر تحديدًا، قائمة من السلاسل: I, love, Learning, on, JavaRush سيتم تحويلها إلى مصفوفة من نفس السلاسل. ولكن أولا، مكافأة صغيرة. دعونا نتحدث عن كيفية كتابة القائمة بسرعة.
كيفية كتابة قائمة للصفيف بسرعة
تذكر: هناك سيناريوهان في هذه الحياة. الأول هو الكآبة والملل المطلقان عندما نقوم بتهيئة قائمة جديدة:List<String> wordsList = new ArrayList();
ومن ثم نضيف إليها القيم...واحدة تلو الأخرى...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
ليس جيد. لقد نسيت سبب الحاجة إلى القائمة أثناء إنشائها! الطريقة الثانية هي قطع كل الأشياء غير الضرورية واعتماد... فئات المنفعة. على سبيل المثال، الفئة Arrays
التي لديها طريقة مريحة بشكل لا يصدق asList
. يمكنك تمرير ما تريد لإنشاء قائمة فيه، وستجعله الطريقة قائمة. شيء من هذا القبيل:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
تأخذ هذه الطريقة في حد ذاتها varargs
- بمعنى ما، مجموعة. أعتذر عن حقيقة أنه في المحاضرة التي تسمى القائمة للمصفوفة علمتك المصفوفة للقائمة أولاً، لكن الظروف اقتضت ذلك. حسنًا، الآن إلى طرقنا لتحويل القوائم إلى مصفوفات.
الطريقة رقم 1. اعتقال
هذه الطريقة مثالية لأولئك الذين يحبون كتابة التعليمات البرمجية على لوحة المفاتيح دون الكثير من التفكير. نوع من التأمل. الخطوة 1. قم بإنشاء مصفوفة بنفس طول القائمة:List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
الخطوة 2. قم بإنشاء حلقة باستخدام عداد للتكرار عبر جميع عناصر القائمة والتمكن من الوصول إلى خلايا المصفوفة عن طريق الفهرس:
for (int i = 0; i < wordsList.size(); i++) {
}
الخطوة 3. داخل الحلقة، نقوم بتعيين قيمة كل عنصر في القائمة ذات الفهرس i إلى خلية المصفوفة ذات الفهرس i:
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
نتيجة:
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
}
الطريقة رقم 2. طريقة الصفيف
ربما هو الشيء الأمثل للاستخدام. تحتوي الواجهةList
على طريقتين toArray
لإنشاء مصفوفة من القائمة الحالية:
Object[] toArray();
T[] toArray(T[] a);
تقوم الطريقة الأولى بإرجاع مصفوفة من الكائنات التي تحتوي على جميع عناصر القائمة الحالية (من الأول إلى الأخير):
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = (String[]) wordsList.toArray();
for (String word : wordsArray) {
System.out.println(word);
}
}
}
لنقم بتشغيل الطريقة main
ونرى ما يلي:
I
love
learning
on
JavaRush
ومع ذلك، فإن هذه الطريقة لها خصوصية: فهي تقوم دائمًا بإرجاع مجموعة من الكائنات (Object[])
. ولذلك، يجب تحويل النتيجة التي تم إرجاعها إلى نوع البيانات المطلوب. في المثال أعلاه قمنا بإلقاء الأمر على مجموعة من السلاسل (String[])
. لكن هذه الطريقة لا تقبل الحجج، الأمر الذي قد يكون مناسبًا في بعض المواقف. تقوم الطريقة الثانية أيضًا بإرجاع مصفوفة تحتوي على كافة عناصر القائمة الحالية (من الأول إلى الأخير). ومع ذلك، على عكس الطريقة الأولى، تأخذ الطريقة الثانية مصفوفة من نوع معين كوسيطة. لكن نتيجة الطريقة الثانية لن تكون مصفوفة من الكائنات، بل مصفوفة من نوع بيانات معين - نفس نوع البيانات في طريقة المصفوفة التي تم تمريرها كوسيطات.
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = wordsList.toArray(new String[0]);
for (String word : wordsArray) {
System.out.println(word);
}
}
}
إذا قمنا بتشغيل الطريقة main
، فسنرى نفس الكلمات في الإخراج:
I
love
learning
on
JavaRush
دعونا نتحدث قليلاً عن المصفوفة التي تم تمريرها كوسيطة إلى toArray
. يعتمد منطق الطريقة على طول المصفوفة المرسلة. هناك ثلاثة سيناريوهات محتملة:
1. طول المصفوفة المرسلة أقل من طول القائمة
في هذه الحالة، تقوم الطريقة بإنشاء مصفوفة جديدة وتضع عناصر القائمة فيها. وقد أثبتنا ذلك في المثال أعلاه.2. طول العنصر الذي يتم تمريره يساوي طول القائمة
ستضع الطريقة عناصر القائمة في المصفوفة التي تم تمريرها. دعونا نوضح هذا:public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив нужной длины
String[] array = new String[wordsList.size()];
// Отправляем пустой массив в метод toArray
wordsList.toArray(array);
// Проверяем, заполнился ли наш массив. Спойлер: да
for (String word : array) {
System.out.println(word);
}
}
}
عند الإخراج، سنرى نفس الأسطر، وسيصبح من الواضح أن الطريقة قد ملأت المصفوفة التي أنشأناها.
3. طول المصفوفة المرسلة أكبر من طول القائمة
ستكتب الطريقة جميع عناصر القائمة في مصفوفة، وستكتب القيمة في الخلية المجاورة لآخر عنصر تمت إضافتهnull
. دعونا نوضح هذا:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив, длина которого в 2 раза больше длины списка
String[] array = new String[wordsList.size() * 2];
for (int i = 0; i < array.length; i++) {
// В каждую ячейку запишем строковое представление текущего индекса
array[i] = String.valueOf(i);
}
// Отправляем массив в метод toArray
wordsList.toArray(array);
// Проверяем, что лежит в нашем массиве
for (String word : array) {
System.out.println(word);
}
}
}
بعد تشغيل الطريقة main
في وحدة التحكم سنرى ما يلي:
I
love
learning
on
JavaRush
null
6
7
8
9
أي طريقة من بين الثلاثة يجب أن تختار؟ في الإصدارات المبكرة من Java، كان من الأمثل تمرير مصفوفة بطول يساوي أو أكبر من طول القائمة. ومع ذلك، تتمتع JVMs الحديثة بتحسينات، وفي بعض الحالات توفر أداءً أسرع لطريقة يتم تمريرها إلى مصفوفة ذات طول أقصر من طول القائمة. لذلك، إذا كنت تقوم بتشغيل إصدار حديث من Java، فقم بتمرير مصفوفة فارغة إلى الطريقة كما فعلنا في المثال الأول:
wordsList.toArray(new String[0]);
الطريقة رقم 3. دفق API
هذه الطريقة مناسبة لأولئك الذين لا يريدون تحويل القائمة إلى مصفوفة فحسب، بل يريدون أيضًا حل بعض المشكلات الأخرى على طول الطريق. وأيضًا للأشخاص المطلعين على Java Stream API. لدى JavaRush مقالة جيدة حول هذا الموضوع . في هذا القسم سوف نلقي نظرة على عدة أمثلة باستخدام التدفقات. كيفية تحويل القائمة إلى مصفوفة باستخدام التدفقات:public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
love
learning
on
JavaRush
*/
}
}
ولكن إذا كنت بحاجة فقط إلى إرسال قائمة إلى مصفوفة، فمن الأفضل القيام بذلك باستخدام الطريقة toArray
الموضحة في الطريقة رقم 2. ولكن إذا كنت لا تريد تحويل قائمة إلى مصفوفة فحسب، بل تريد أيضًا تنفيذ بعض الإجراءات على كل عنصر، فهذا هو المكان المناسب لك. دعنا نحاول تحويل القائمة إلى مصفوفة بحيث تكون جميع الأسطر في المصفوفة النهائية مكتوبة بأحرف كبيرة:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
LOVE
LEARNING
ON
JAVARUSH
*/
}
}
.map(str -> str.toUpperCase())
لقد حددنا هنا ما يجب القيام به مع كل سطر في القائمة. في هذه الحالة، قررنا تحويل كل سلسلة إلى أحرف كبيرة ثم تجميعها في مصفوفة. يتيح لك استخدام Stream API ليس فقط تحويل كل قيمة، بل أيضًا تصفيتها. لنفترض أننا نريد جمع مصفوفة من قائمة السلاسل، ولكن بطريقة يتم تضمين السلاسل الأطول من حرفين فقط في المصفوفة:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.filter(str -> str.length() > 2)
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
LOVE
LEARNING
JAVARUSH
*/
}
}
.filter(str -> str.length() > 2)
لقد أنشأنا هنا في السطر ما يسمى بالمرشح الذي سيتم تطبيقه على كل عنصر في القائمة قبل أن ينتقل إلى المصفوفة. في هذه الحالة، يتم استدعاء الطريقة لكل صف length()
، وإذا كانت نتيجة التعبير str.length() > 2
صحيحة، فسينتهي هذا الصف في التحديد الناتج، وفي النهاية في المصفوفة. وإلا فلن يضرب. ولعل من الجدير بالذكر هنا أنه يمكن تحقيق نفس الشيء بمجرد تكرار العناصر وفرض قيود مختلفة. يمكنك القيام بذلك بهذه الطريقة أيضًا. يوفر Stream API طريقة أكثر وظيفية لحل مثل هذه المشكلات.
نتائج
في هذه المقالة، نظرنا إلى طرق مختلفة لتحويل القوائم إلى مصفوفات:- بحث بسيط؛
- طريقة
toArray;
- دفق API.
toArray
المحددة في الواجهة List
. هناك طريقتان من هذا القبيل:
Object[] toArray();
T[] toArray(T[] a);
GO TO FULL VERSION