معکوس کردن یک لیست در جاوا - در محل و خارج از محل

در این آموزش کوتاه، شما یاد خواهید گرفت که چگونه یک لیست را در جاوا و خارج از مکان خود تغییر دهید.

معکوس کردن در محل و خارج از محل

هنگام انجام عملیات بر روی لیست ها - ممکن است بخواهید در نظر بگیرید که آیا عملیات در محل انجام می شود (تغییرات روی شی اصلی اعمال می شوند)، یا اینکه آیا آنها خارج از محل هستند (تغییرات روی یک کپی و نسخه اصلی اعمال می شوند). شی بدون تغییر است).

برخی از زبان ها و کتابخانه ها رفتارهای پیش فرض متفاوتی را ترجیح می دهند. در جاوا، بیشتر عملیات بر روی لیست های معکوس انجام می شود درجا.

اگر این رفتار مورد نظر شماست - عالی! اگر نه، می‌خواهید قبل از برگرداندن کپی، یک کپی از لیست ایجاد کنید:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

توجه داشته باشید: La clone() روش نمیکند یک کپی عمیق ایجاد کنید ایجاد لیست با استفاده از new ArrayList(list) نمیکند یک کپی عمیق ایجاد کنید ایجاد کپی های عمیق توصیه نمی شود، و به طرز شگفت انگیزی انجام آن به روشی عمومی دشوار است (و در برخی موارد، بسته به نوع داده ها در لیست، منطقی نیست). این شما را از توانایی معکوس باز نمی دارد list و نه دارای عناصر listCopy با این حال معکوس شدن

Collections.reverse()

La Collections.reverse() متد روش استانداردی برای معکوس کردن یک مجموعه است و به عنوان "فقدان" عمل می کند. List.reverse() روش. این لیست را در جای خود معکوس می کند:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

Collections.reverse(list);

System.out.println(list);     
System.out.println(listCopy); 

Guava's Lists.reverse(list)

اگر قبلاً در پروژه خود از Google Guava استفاده می کنید، می توانید از آن نیز استفاده کنید Lists کلاس، که ارائه می دهد reverse() روش، که لیست اصلی را در جای خود مرتب نمی کند، اما یک کپی ایجاد می کند و کپی را برعکس می کند:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List reversedList = Lists.reverse(list);

System.out.println(list);         
System.out.println(reversedList); 

اگر قبلاً آن را ندارید، می‌توانید Google Guava را با استفاده از Maven به پروژه خود اضافه کنید، با درج وابستگی آن در pom.xml فایل:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
</dependency>

یا از طریق Gradle:

implementation group: 'com.google.guava', name: 'guava'

توجه داشته باشید: اگر قبلاً Google Guava را ندارید یا نمی‌خواهید از آن برای بخش‌های دیگر پروژه خود استفاده کنید - آن را فقط برای این عملیات وارد نکنید و به Collections.reverse() روش. گواوا یک وابستگی بزرگ است، و استفاده از آن فقط برای این عملیات یک اضافات بزرگ است.

List.add() و List.remove()

اگر می‌خواهید علاوه بر معکوس کردن فهرست، عملیات دیگری نیز انجام دهید - می‌توانید از طریق فهرست اصلی تکرار کنید، عناصر را از انتها حذف کنید، آنها را از طریق یک روش دلخواه عبور دهید و در ابتدای لیست دوباره اضافه کنید:


public static int process(int input) {
    return input;
}

List list = new ArrayList(Arrays.asList(1, 2, 3));

for (int i = 0, j = list.size()-1; i <= j; i++) {
    int lastValue = process(list.remove(j));
    list.add(i, lastValue);
}

System.out.println(list);  

محک

بنابراین، کدام سریعترین است؟ این همچنین به این بستگی دارد که می خواهید عملیات را در محل انجام دهید یا خارج از محل.

معیار معکوس در محل

بیایید هر دو رویکرد را در هر سه روش محک بزنیم، که از بی‌جا شروع می‌کنیم:

List list = new Random().ints(100, 1, 11)
                .boxed()
                .collect(Collectors.toList());

int runs = 1000;

long start1 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListCollections(list);
}
long end1 = System.currentTimeMillis();
System.out.println(String.format("Collections.reverse() took: %s miliseconds", end1-start1));

long start2 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListGuava(list);
}
long end2 = System.currentTimeMillis();
System.out.println(String.format("Guava's Lists.reverse() took: %s miliseconds", end2-start2));

long start3 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListManually(list);
}
long end3 = System.currentTimeMillis();
System.out.println(String.format("Manually took: %s miliseconds", end3-start3));

System.out.println("Original list: " + list);

این نتیجه در:

Collections.reverse() took: 3 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 13 miliseconds
Original list: [6, 7, 9, 7, 2, 5, 4, 1, 3, 2, 2, 6, ...

راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!

وقتی تعداد عناصر را از 100 به 1000 افزایش دهیم چه اتفاقی می افتد؟

Collections.reverse() took: 9 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 133 miliseconds
Original list: [10, 2, 2, 6, 2, 4, 7, 3, 9, 2, 7, 5, ...

گواوا علامت 4 میلی ثانیه را حفظ می کند! رویکرد دستی بدترین پیچیدگی زمانی را دارد و به صورت خطی افزایش یافت. Collections.reverse() از افزایش مقیاس کمتر رنج می برند، اما اجرای Guava کمترین آسیب را می بیند. با این حال، به خاطر داشته باشید که ما به صورت دستی لیست را برای رویکرد Guava کپی نمی کنیم. آیا زمانی که ما ایده داشتن یک لیست "اصیل" و "معکوس" را کنار بگذاریم، معیار تغییر خواهد کرد؟

معیار معکوس خارج از محل

با 1000 عنصر، و هر کدام بر روی یک کپی غیر معکوس از لیست (که از اندازه‌گیری‌های زمان حذف شده بود) کار می‌کند، وقتی کپی دستی را از هر روش حذف می‌کنیم و کد را دوباره اجرا می‌کنیم:

Collections.reverse() took: 7 miliseconds
Guava's Lists.reverse() took: 3 miliseconds
Manually took: 131 miliseconds
Original list: [6, 8, 10, 7, 3, 8, 7, 1, 1, 9, 5, ...

گیاهان و بتها ا هنوز موفق می شود به طور مداوم از هر دو عملکرد بهتری داشته باشد Collections.reverse() و رویکرد دستی

نتیجه

در این راهنمای کوتاه، شما یاد گرفتید که چگونه یک لیست را در جاوا، در محل و خارج از محل، معکوس کنید، و لیست اصلی را از عملیات حفظ کنید. ما استفاده کرده ایم Collections.reverse() روش، گوگل گواوا Lists.reverse() روش و رویکرد دستی

تمبر زمان:

بیشتر از Stackabuse