עבור לתוכן

שאלה ספציפית למתכנתים בJAVA בנוגע ל Collections

Featured Replies

פורסם

היי.

יש לי 2 רשימות מקושרות שנניח מכילות אובייקטים של חריגות. ואני רוצה לקבל את כל מה שנמצא ברשימה הראשונה אבל לא בשנייה.

אז רציתי להשתמש ב removeAll שזה בעצם עושה את העבודה. רק ש LinkedList לא מממשת את removeAll.

מה אני כן יכולה לעשות? :-\

תודה רבה מראש

פורסם

לא הבנתי מה הבעיה

אם יש לך 2 רשימות ואתה רוצה לקבל רק אחת אז תקח רק אחת. מה השניה מעניינת אותך?

פורסם
  • מחבר

לא הבנת.

מה שאני רוצה זה לקבל את הרשימה הראשונה מינוס האלמנטים שקיימים ברשימה השנייה.

למשל:

רשימה 1: {"a", "b", "c"}

רשימה 2: {"d", "e", "a"}

אז רשימה 1 עכשיו צריכה להיות: {"b", "c"}

ו removeAll עושה את זה.

בכל מקרה, הבעייה שלי היא להשתמש ב removeAll כש LinkedList לא מממשת את הפונקציה הזאת. מי שכן מממש זה קלאסים שהיא יורשת מהם.

פורסם

אני לא רואה סיבה למה לא להשתמש ב-removeAll שנורש מ-AbstructCollection אבל אם אתה מתעקש

          ans = new LickedList(a); // ans = a-b;

          for (int j = 0; j < ans.size(); j++) {

            if (b.contains(EntryList.get(j))) {

              ans.remove(j--);

            }

          }

פורסם
  • מחבר

אין לי שום בעייה להשתמש ב-removeAll שנורש מ-AbstructCollection .... אם הייתי יודעת איך.

אתה כנראה לא מבין מה הבעייה כי לך זה ברור מאליו. אני חדשה לג'אווה ואני פשוט לא מבינה את כל העניין הזה. למה בכלל יש לי את האפשרות להשתמש ב removeAll שיש ב LinkedList אם היא לא ממומשת??? הרי זה יזרוק לי UnsupportedOperationException.

אז נגיד יש לי דבר כזה:

LinkedList ls1= new LinkedList();

LinkedList ls2= new LinkedList();

ונניח שמילאתי אותן באובייקטים...

ועכשיו אני רוצה לעשות:

ls1.removeAll(ls2);

זה יזרוק לי UnsupportedOperationException

אז מה אני עושה?  :'(

ובאמת תודה שאתה מנסה לעזור.

פורסם

פה עובד יופי removeAll ולא זורק שום Exception

הרעיון ב-Java שכל מחלקה (Class) יכול (וחייב) לרשת ממחלקה אחרת (אם את לא מגדירה כלום היא יורשת מהמחלקה Object)

יחד עם הירושה היא מקבל את כל הפונקציות והמשתנים שהם מסוג public. לכן מחלקה שיורשת ממחלקה אחרת יכולה להריץ את הפונקציות של המחלקה האחרת.

במקרה שלנו LinkedList יורש מימישהו שיורש ממישהו שיורש מימשהו ומישהו באמצע מממש את removeAll. אז אין שום בעיה וקרוא לפונקציה הנ"ל.

פורסם
  • מחבר

אני כנראה סתומה לגמרי כי או שאני לא מבינה אותך או שאני לא עושה משהו טוב.

כמו שאמרתי, ביצעתי את הקוד ההוא, ובזמן ריצה, זה תמיד זורק לי UnsupportedOperationException.

שוב:

LinkedList ls1= new LinkedList();

LinkedList ls2= new LinkedList();

ls1.add("a");

ls1.add("b");

ls1.add("c");

ls1.add("d");

ls2.add("c");

ls2.add("e");

ls1.removeAll(ls2); // UnsupportedOperationException פה התוכנית עוצרת לי עם

לפי מה שקראתי איפשהו, LinkedList לא מממשת (אמנם יורשת, אבל לא מממשת) את removeAll. ובגלל זה נזרקת החריגה הזאת.

אז אתה אומר שהיא כן מממשת וכן אפשרי? אז למה אצלי זה לא עובד? :o

אגב הנה משהו שכתוב באיזה מדריך לג'אווה:

Youll discover that only a portion of the Collection and List interfaces are actually implemented. The rest of the methods cause the unwelcome appearance of something called an UnsupportedOperationException. The Collection interfaceas well as some of the other interfaces in the Java containers librarycontain optional methods, which might or might not be supported in the concrete class that implements that interface. Calling an unsupported method causes an UnsupportedOperationException to indicate a programming error

פורסם

פה הקוד הזה עובד יופי

על איזה סיבבה את עובדת?

אני עובד על JVM J2SE 1.4.2 בסביבת Borland JBuilder X Foundation

פורסם
  • מחבר

אז אתה אומר שזה עובד אצלך? הממ... אוקיי. טוב לדעת.

אני עובדת עם Microsoft Visual J# .NET אמורה להיות עם זה בעייה? :-[

פורסם

עובד אם סביבת עבודה בשם Eclipse. גם כאן הכל עובד בסדר.

פורסם

כנראה שזה גירסה ישנה יותר

לא תהיה לך ברירה אלה להשתמש בקוד שנתתי לך

          ans = new LickedList(a); // ans = a-b;

          for (int j = 0; j < ans.size(); j++) {

            if (b.contains(EntryList.get(j))) {

              ans.remove(j--);

            }

          }

פורסם
  • מחבר

סבבה.

תודה רבה :)

אני לפחות יותר רגועה כשאני יודעת שזה כן אמור לעבוד רק בסביבת עבודה אחרת.

פורסם
  • מחבר

יש לי שאלה אחרת עכשיו.

במידה ומישהו יוכל לענות לי עד היום בשעה 15:30 אני אודה לו מאוד.

נניח שמה שאני מכניסה לרשימות זה אובייקטים של חריגות.

דוגמא:

LinkedList ExList = new LinkedList();

LinkedList ExList2 = new LinkedList();

Exception a = new ClassNotFoundException();

Exception b = new ArrayIndexOutOfBoundsException("b");

Exception c = new ClassNotFoundException("c");

Exception d = new ArrayStoreException("a");

Exception e = new ClassNotFoundException();

Exception f = new UnsupportedOperationException("f");

Exception g = new NullPointerException("g");

ExList.add(a);

ExList.add(b);

ExList.add(b);

ExList.add(d);

ExList2.add(e);

ExList2.add(f);

ExList2.add(g);

if(ExList.remove(ExList2.get(0))); // false???

{

System.out.println("printing after removing ExList:");

System.out.println(ExList);

}

משום מה זה לא נכנס לי לתנאי. אבל זה כן אמור להכנס. הרי a שווה ל e לא?

אז ה remove אמור להוציא לי את האובייקט הזה מהרשימה הראשונה. וזה לא ככה. מישהו יכול להסביר לי למה?

שוב תודה וסליחה על כל ההצקות .

פורסם

תורידי את הנקודה פסיק אחרי הIF

פורסם
  • מחבר

LOL. זו סתם טעות הקלדה שלי כששמתי את זה פה.

בתוכנית זה היה בלי הנקודה פסיק. הרי זה היה נותן לי טעות קומפילציה אם זה היה ככה.

זו לא הבעייה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים