CodeGym /وبلاگ جاوا /Random-FA /LinkedHashSet در جاوا
John Squirrels
مرحله
San Francisco

LinkedHashSet در جاوا

در گروه منتشر شد
صحبت از کلاس LinkedHashSet در جاوا، لازم به ذکر است که این کلاس رابط Set را پیاده سازی می کند . LinkedHashSet مجموعه ای ایجاد می کند که عناصر را در یک جدول هش ذخیره می کند اما ترتیب درج عناصر را برخلاف همتای HashSet خود حفظ می کند.

آنچه در جاوا تنظیم شده است

اجازه دهید به طور خلاصه یادآوری کنیم که رابط Set یک مجموعه (مجموعه) را تعریف می کند. مجموعه را گسترش می دهد و رفتار مجموعه هایی را تعریف می کند که اجازه عناصر تکراری را نمی دهند. بنابراین، اگر سعی شود یک عنصر تکراری به مجموعه اضافه شود، متد add() false را برمی گرداند . اینترفیس هیچ روش اضافی از خود تعریف نمی کند. رابط Set از منحصر به فرد بودن اشیاء ذخیره شده مراقبت می کند، منحصر به فرد بودن با اجرای متد () quals تعیین می شود . بنابراین، اگر اشیاء کلاس ایجاد شده به Set اضافه شوند ، مطلوب است که متد () quals لغو شود .

کلاس LinkedHashSet

قبل از اینکه در مورد کلاس LinkedHashSet صحبت کنیم ، لازم است به بستگان نزدیک آن یعنی کلاس HashSet اشاره کنیم . HashSet رابط Set را پیاده سازی می کند . مجموعه ای ایجاد می کند که عناصر را در یک جدول هش ذخیره می کند. عناصر جدول هش به صورت جفت کلید-مقدار ذخیره می شوند. کلید سلول (یا بخش) را برای ذخیره مقدار مشخص می کند. محتوای کلید برای تعیین یک مقدار منحصر به فرد به نام کد هش استفاده می شود. می‌توانیم یک کد هش را به عنوان یک شناسه شی در نظر بگیریم، اگرچه لزومی ندارد که یکتا باشد. این کد هش همچنین به عنوان شاخصی عمل می کند که داده های مرتبط با کلید در آن ذخیره می شود. کلاس جاوا LinkedHashSet HashSet را بدون افزودن هیچ روش جدیدی گسترش می دهد. LinkedHashSet به شما اجازه می دهد تا به سرعت وجود یک ورودی را بررسی کنید، درست مانند HashSet ، اما حاوی یک لیست مرتب شده در داخل است. این بدان معنی است که ترتیب درج عناصر را ذخیره می کند. به عبارت دیگر، LinkedHashSet یک لیست پیوندی از عناصر مجموعه را به ترتیبی که درج شده اند حفظ می کند. این اجازه می دهد تا تکرار مرتب درج در یک مجموعه. اما این باعث می شود که کلاس LinkedHashSet عملیات طولانی تر از کلاس HashSet انجام دهد .

ویژگی های مهم LinkedHashSet

  • ما می توانیم عناصر منحصر به فرد را فقط در یک LinkedHashSet ذخیره کنیم

  • LinketHashSet به ما اجازه می دهد تا عناصر را به همان ترتیبی که درج می کنیم استخراج کنیم

  • LinkedHashSet همگام نیست

  • LinkedHashSet امکان ذخیره عناصر تهی را فراهم می کند

  • LinkedHashSet از تکنیک هش برای ذخیره عناصر در یک شاخص مشخص بر اساس کد هش استفاده می کند.

روش های LinkedHashSet

HashSet علاوه بر متدهایی که از کلاس‌های والد خود به ارث می‌برد، متدهای زیر را تعریف می‌کند:
  • boolean add(Object o) عنصر مشخص شده را در صورتی که از قبل موجود نباشد به این مجموعه اضافه می کند.

  • void clear() تمام عناصر را از این مجموعه حذف می کند.

  • Object clone () یک کپی کم عمق از این نمونه LinkedHashSet را برمی گرداند : خود عناصر شبیه سازی نشده اند.

  • اگر این مجموعه حاوی عنصر مشخص شده باشد، boolean contain(Object o) true را برمی گرداند.

  • اگر این مجموعه فاقد عنصر باشد، isEmpty() boolean true برمی گرداند .

  • Iterator iterator() یک تکرار کننده را روی عناصر این مجموعه برمی گرداند.

  • حذف boolean (Object o) عنصر مشخص شده را در صورت وجود از این مجموعه حذف می کند.

  • int size() تعداد عناصر این مجموعه (تعداد عناصر آن) را برمی گرداند.

مثال‌های Easy LinkedHashSet در مثال زیر مقدار دهی اولیه شی LinkedHashSet را نشان می‌دهیم و از متد add() برای پر کردن مجموعه استفاده می‌کنیم.
import java.util.LinkedHashSet;
import java.util.Set;

   public class LinkedHashSetEx1 {
       public static void main(String[] args) {
//LinkedHashSet() Init
Set<String> set = new LinkedHashSet<>();
//adding elements to LinkedHashSet
           set.add("Re"); //first added element
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");//last added element


           System.out.println(set);
       }
   }
خروجی این است:
[Re، Do، Fa، Sol، La، Ti، Mi]
همانطور که می بینید، عناصر موجود در مجموعه ما به همان ترتیبی ظاهر شدند که آنها را در آن قرار دادیم. LinkedHashSet در جاوا - 1

مثال 2. افزودن یک نسخه تکراری به LinkedHashSet

بیایید 7 عنصر LinkedHashSet خود را با نام آهنگ‌های موسیقی دوباره قرار دهیم و یک عنصر جدید که مانند یکی از عناصر قبلی است قرار دهیم.
import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetEx2 {
   public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           set.add("Sol");
           System.out.println(set);
       }
   }
خروجی برنامه اینجاست:
[Re، Do، Fa، Sol، La، Ti، Mi]
خروجی مثال دو دقیقاً مشابه مثال اول است. ما نمی توانیم دو عنصر مشابه در مجموعه LinkedHashSet داشته باشیم . وقتی می‌خواهیم مورد دوم را قرار دهیم، نادیده گرفته می‌شود.

مثال 3. حذف عناصر از LinkedHashSet

import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           System.out.println(set);
           set.remove("Fa");// removing an element from our set
           set.remove("Score");//trying to remove element that isn't in set
           System.out.println(set.remove("Score"));
           System.out.println("Print our set without elements removed: ");
           System.out.println(set);
           set.clear();
           System.out.println("Print out our set after clear command: ");
           System.out.println(set);
       }
   }
خروجی برنامه اینجاست:
[Re, Do, Fa, Sol, La, Ti, Mi] false مجموعه ما را بدون حذف عناصر چاپ کنید: [Re, Do, Sol, La, Ti, Mi] مجموعه ما را پس از دستور روشن چاپ کنید: []
همانطور که می بینید، متد remove() اعمال شده روی یک عنصر غیر موجود منجر به خطای برنامه نمی شود. اگر عنصر حذف نشده باشد، به سادگی false و اگر عنصر در LinkedHashSet باشد و سپس حذف شود، true را برمی‌گرداند.

LinkedHashSet در مقابل HashSet

این دو طبقه از اقوام نزدیک هستند. اما در داخل HashSet از HashMap برای ذخیره اشیاء استفاده می کند در حالی که LinkedHashSet از LinkedHashMap استفاده می کند . اگر نیازی به حفظ ترتیب درج ندارید، اما نیاز به ذخیره اشیاء منحصر به فرد دارید، بهتر است از HashSet استفاده کنید . اگر نیاز به حفظ ترتیب درج عناصر دارید، LinkedHashSet انتخاب شماست. عملکرد LinkedHashSet کمی کندتر از HashSet است زیرا LinkedHashSet از LinkedList داخلی برای حفظ ترتیب درج عناصر استفاده می کند. بیایید مثالی بزنیم:
import java.util.*;

public class LinkedHashSetExample1 {

   public static void main(String[] args) {
       // while regular hash set orders its elements according to its hashcode stamps

       Set<Integer> regularHashSet = new HashSet<>();
       regularHashSet.add(7);
       regularHashSet.add(3);
       regularHashSet.add(5);
       regularHashSet.add(65536);
       regularHashSet.add(9);
       // few duplicates
       regularHashSet.add(5);
       regularHashSet.add(7);

       // next will print:
       // > regularHashSet = [65536, 3, 5, 7, 9]
       System.out.println("regularHashSet = " + regularHashSet);

       // linked hash set keeps order of adding unchanged

       Set<Integer> linkedHashSet = new LinkedHashSet<>();
       linkedHashSet.add(7);
       linkedHashSet.add(3);
       linkedHashSet.add(5);
       linkedHashSet.add(65536);
       linkedHashSet.add(9);
       // few duplicates
       linkedHashSet.add(5);
       linkedHashSet.add(7);

       // next will print:
       // > linkedHashSet = [7, 3, 5, 65536, 9]
       System.out.println("linkedHashSet = " + linkedHashSet);
   }
}
خروجی برنامه این است:
regularHashSet = [65536, 3, 5, 7, 9] linkedHashSet = [7, 3, 5, 65536, 9]

استفاده از Java LinkedHashSet در برنامه های کاربردی دنیای واقعی

از آنجایی که LinkedHashSet به شما امکان می دهد تا به سرعت وجود یک ورودی را بررسی کنید و همچنین سفارش را ذخیره کنید، به نظر می رسد این مجموعه برای حذف موارد تکراری از یک لیست بسیار راحت است. یا مثلاً حل مشکلاتی مانند آخرین موردی که اخیراً در کیفم دیده شده است. یا چنین بازی Pokemon Go را به خاطر دارید؟ LinkedHashSet می‌تواند فهرستی از پوکمون‌هایی که با آن‌ها برخورد کرده‌اید و ترتیبی که در مسیر شما با آن‌ها برخورد کرده‌اند را ذخیره کند. در این صورت، پوکمون "تکرار شده" دیگر به لیست اضافه نخواهد شد. یا به عنوان مثال، لیستی از باس ها بر اساس سطح که قبلاً در هر بازی با سطوح ملاقات کرده اید. یا تاریخچه کشف اجسام کیهانی. LinkedHashSet به شما این امکان را می دهد که به سرعت بررسی کنید که آیا یک جسم فضایی از قبل در لیست وجود دارد یا خیر، و اگر در آنجا نیست، آن را به لیست اضافه کنید. بیایید مثالی از حذف موارد تکراری بزنیم.
import java.util.*;

class LinkedHashSetExample2 {
   public static void main(String[] args) {
       List<String> listWithDuplicates = List.of("some","elements","with", "few", "duplicates", "were", "here", "duplicates", "duplicates");

       Set<String> linkedHashSet = new LinkedHashSet<>(listWithDuplicates);
       List<String> listWithoutDuplicates = new ArrayList<>(linkedHashSet);

       // next will print:
       // > listWithDuplicates = [some, elements, with, few, duplicates, here, duplicates, duplicates]
       System.out.println("listWithDuplicates = " + listWithDuplicates);
       // next will print:
       // > listWithoutDuplicates = [some, elements, with, few, duplicates, here]
       System.out.println("listWithoutDuplicates = " + listWithoutDuplicates);

       // -------------------------------------------------------------------------

       // while using regular Hash Set will generally produces some unexpected order
       Set<String> regularHashSet = new HashSet<>(listWithDuplicates);

       // next will print:
       // > linkedHashSet = [some, elements, with, few, duplicates, were, here]
       System.out.println("linkedHashSet = " + linkedHashSet);
       // next will print:
       // > regularHashSet = [here, some, with, duplicates, were, elements, few]
       System.out.println("regularHashSet = " + regularHashSet);
   }
}
خروجی برنامه اینجاست:
listWithDuplicates = [بعضی، عناصر، با، تعداد کمی، تکراری، بود، اینجا، تکراری، تکراری] listWithoutDuplicates = [بعضی، عناصر، با، تعداد کمی، تکراری، در اینجا] linkedHashSet = [برخی، عناصر، با، تعداد کمی، تکراری , were, here] regularHashSet = [اینجا، برخی، با، تکراری، بودند، عناصر، چند]
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION