Avatar billede tlunde Nybegynder
04. august 2003 - 14:02 Der er 35 kommentarer og
1 løsning

Fjern et random objekt fra LinkedList?

Hejsa,
Jeg har en LinkedList, hvor der er gemt x antal objekter i, og nu skal jeg så have lavet en funktion, der sletter et vilkårligt objekt af dem der er gemt deri. Hvordan gøres det nemmest??
Avatar billede arne_v Ekspert
04. august 2003 - 14:10 #1
...

import java.util.*;

...

private Random rng = new Random();

...

private ArrayList list;

...

list.remove(rng.nextInt(list.size()));

...
Avatar billede arne_v Ekspert
04. august 2003 - 14:12 #2
Hov:

private LinkedList list;

naturligvis (det gør ingen forskel).
Avatar billede tlunde Nybegynder
04. august 2003 - 14:36 #3
okay, det virker, men der er lige en ting mere.
Kan man få skrevet det objekt man vilkårligt får fjernet?
Avatar billede arne_v Ekspert
04. august 2003 - 14:50 #4
Ja.

remove metoden returnerer nemlig det fjerenede objekt.

System.out.println(list.remove(rng.nextInt(list.size())));

eller:

Xclass xobject = (Xclass)list.remove(rng.nextInt(list.size()));
System.out.println(xobject);
Avatar billede tlunde Nybegynder
04. august 2003 - 17:07 #5
Har du lyst til at hjælpe lidt mere :)

Jeg er nu ved at lave en metode der skal tjekke om et objekt allerede er gemt i listen, og der har jeg prøvet det her, men det virker ikke rigtigt. Gør jeg noget forkert??

Her er metoden:

    public boolean tjeckObjects(Object newObject)
    {
        if(list.equals(newObject) == false)
        {
            System.out.println("A new object is added");
            list.addFirst(newObject);
        }
        else
        {
            System.out.println("The object is already in the list");
        }   
        return true;
    }
Avatar billede mikkelbm Nybegynder
04. august 2003 - 17:35 #6
Du bliver nok nødt til at løbe hele listen igennem i en for-løkke...

boolean findes = false;

for(int i = 0; i < list.size(); i++)
{
  if(list.get(i).equals(newObject) == false)
  {
      System.out.println("A new object is added");
      list.addFirst(newObject);
  }
  else
  {
      System.out.println("The object is already in the list");
      findes = true;
  }   
}
return findes;
Avatar billede mikkelbm Nybegynder
04. august 2003 - 17:50 #7
glem det jeg postede før.... det virker ikke.

det her virker:

public static boolean ckObjects(Object newObject)
{
  boolean findes = false;
  for(int i = 0; i < list.size(); i++)
  {
      if(list.get(i).equals(newObject))
      {
        findes = true;
      }
  }
  if(findes)
  {
      System.out.println("The object is already in the list");
  }
  else
  {
      System.out.println("A new object is added");
      list.add(newObject);
  }
  return findes;
}
Avatar billede arne_v Ekspert
04. august 2003 - 17:51 #8
En liste er ikke lig med et objekt i listen.

Prøv med:

public boolean tjeckObjects(Object newObject)
    {
        if(list.indexOf(newObject) < 0)
        {
            System.out.println("A new object is added");
            list.addFirst(newObject);
        }
        else
        {
            System.out.println("The object is already in the list");
        }   
        return true;
    }
Avatar billede mikkelbm Nybegynder
04. august 2003 - 17:51 #9
og den skal selvfølgelig ikke være statisk...
og metodenavnet kludrede jeg vist også i.... :)
Avatar billede mikkelbm Nybegynder
04. august 2003 - 17:53 #10
Og alt andet lige, så er Arnes metode nok den bedste :) Som sædvanlig...
Avatar billede tlunde Nybegynder
04. august 2003 - 18:30 #11
Nu har jeg prøvet begge forslag, men der er ikke nogen af dem der virker :( Jeg kan stadig tilføje 2 ens objekter i min liste.

Jeg skal lige gøre opmærksom på, at min objekt jeg skal tilføje til listen, består af et tal og en string. Jeg ved ikke om det har noget med det at gøre, at den ikke kan se om de er ens...
Avatar billede arne_v Ekspert
04. august 2003 - 18:36 #12
Hvis det er objekter af en klasse som du selv har defineret, så
skal du have en equals metode der sammenligner tal og streng.
Avatar billede arne_v Ekspert
04. august 2003 - 18:37 #13
Ellers mener Java at 2 forskellige objekter med samme værdier
fot tal og streng er forskellige.
Avatar billede arne_v Ekspert
04. august 2003 - 18:44 #14
Noget a la:

    public boolean equals(Object o) {
        if (o instanceof X) {
            if (tal == ((X)o).tal && tekst == ((X)o).equals(tekst)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
Avatar billede arne_v Ekspert
04. august 2003 - 18:46 #15
skal være:

public boolean equals(Object o) {
        if (o instanceof X) {
            if (tal == ((X)o).tal && ((X)o).tekst.equals(tekst)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
Avatar billede tlunde Nybegynder
04. august 2003 - 19:05 #16
i det sidste eksempel her, hvad er X der?
Avatar billede arne_v Ekspert
04. august 2003 - 19:12 #17
X er navnet på din klasse.
Avatar billede tlunde Nybegynder
04. august 2003 - 19:14 #18
Okay, jeg prøver lige at lege med det, og vender derefter tilbage...Tak for hjælpen indtil videre...
Avatar billede tlunde Nybegynder
04. august 2003 - 21:41 #19
arne:
Jeg har stadig ikke fået det til at virke, det med at sammenligne 2 objekter. Er det virkelig så svært?

Jeg fik godt nok rettet dit sidste forslag til, så programmet kunne compile uden fejl, men stadigvæk kunne jeg indtaste 2 ens objekter i listen.

er der andre måder det kan gøres på?
Avatar billede arne_v Ekspert
04. august 2003 - 21:43 #20
Nej det er måden.

Skal jeg prøve at lave et kørende eksempel ?
Avatar billede arne_v Ekspert
04. august 2003 - 21:51 #21
import java.util.LinkedList;

public class LLCheck {
    private static LinkedList ll = null;

    public static void main(String[] args) {
        ll = new LinkedList();
        ll.add(new Something(1, "a"));
        ll.add(new Something(2, "bb"));
        ll.add(new Something(3, "ccc"));
        System.out.println(ll.indexOf(new Something(0, "")));
        System.out.println(ll.indexOf(new Something(1, "a")));
        System.out.println(ll.indexOf(new Something(2, "bb")));
        System.out.println(ll.indexOf(new Something(3, "ccc")));
        System.out.println(ll.indexOf(new Something(4, "dddd")));
    }
}

class Something {
    private int num = 0;
    private String str = null;
    public Something(int num, String str) {
        this.num = num;
        this.str = str;
    }
    public int getNum() {
        return num;
    }
    public String getStr() {
        return str;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public void setStr(String str) {
        this.str = str;
    }
    public boolean equals(Object o) {
        if (o instanceof Something) {
            if (((Something)o).num == num &&
                ((Something)o).str.equals(str)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}
Avatar billede tlunde Nybegynder
04. august 2003 - 21:51 #22
Ja, det ville da være meget dejligt. Det kan også være at det er mig der har kludret lidt i referencerne til int og string i objekterne...
Avatar billede arne_v Ekspert
04. august 2003 - 21:51 #23
Output:

-1
0
1
2
-1

hvilket ser korrekt ud.
Avatar billede tlunde Nybegynder
04. august 2003 - 21:54 #24
okay, og hvad betyder outputtet så?
Avatar billede arne_v Ekspert
04. august 2003 - 21:54 #25
Du kan evt. starte med at teste din equals ved direkte kald.
Avatar billede tlunde Nybegynder
04. august 2003 - 21:56 #26
Hvad bruges disse to set metoder til:

    public void setNum(int num) {
        this.num = num;
    }
    public void setStr(String str) {
        this.str = str;
    }
Avatar billede arne_v Ekspert
04. august 2003 - 21:59 #27
-1 : findes ikke

>=0 : finde på position

Det er -1 der ligger bag ved testet:

list.indexOf(newObject) < 0
Avatar billede tlunde Nybegynder
04. august 2003 - 21:59 #28
Jeg er meget nybegynder i Java, så det er ikke lige alt jeg forstår hvad du skriver til mig, men jeg prøver så meget som muligt...
Avatar billede arne_v Ekspert
04. august 2003 - 21:59 #29
De 2 set metoder bliver ikke brugt i eksemplet.

Jeg syntes bare at det var pænest at have dem.
Avatar billede arne_v Ekspert
04. august 2003 - 22:04 #30
Du kan evt. poste din klasse og så kan jeg ligge på den !?
Avatar billede tlunde Nybegynder
04. august 2003 - 23:00 #31
Jeg har nu prøvet at rode med det i en times tid, men intet syntes at lykkes for mig i aften :( Her er det kode jeg har siddet og arbejdet med:

public void addNewObject(Object newObject)
{
  allTheObjects.add(newObject);
  System.out.println(allTheObjects.indexOf(newObject));
}

----------------
Object.java
----------------
public boolean equals(Object newObject)
{
  if(newObject instanceof Object)
  {
    if (((Object)newObject).objectNumber == objectNumber && ((Object)newObject).objectName.equals(objectName))
    {
      return true;
    }
    else
    {
      return false;
    }
  }
  else
  {
    return false;
  }
}

Er der nogen fejl i dette?
Avatar billede arne_v Ekspert
04. august 2003 - 23:07 #32
Prøv lige at kald din klasse noget andet end Object !

Der er jo en java.lang.Object klasse og jeg tror at det kan give "sjove"
effekter med en egen Object klasse.
Avatar billede tlunde Nybegynder
05. august 2003 - 08:47 #33
Nu når min equals metode ligger i en anden klasse, end der hvor jeg har min addnewobject metode, hvordan ved jeg så at den equals metode bliver brugt til at tjekke om objektet allerede er i listen??

Og skal det skrives sådan som du har gjort:
public boolean equals(Object o), eller er det ligemeget?
Avatar billede arne_v Ekspert
05. august 2003 - 09:02 #34
Det gør den !

Din equals metode overrider java.lang.Object's equals metode. Og LinkedList
kalder equals.
Avatar billede arne_v Ekspert
05. august 2003 - 09:03 #35
public boolean equals(Object skal være sådan - om du kalder
argumentet for o eller x eller newObject betyder ikke noget.
Avatar billede tlunde Nybegynder
05. august 2003 - 09:32 #36
Jeg har fået det til at virke nu. Det skulle bare lige omskrives lidt for at det kunne virke i mit program...

Jeg takker mange gange for din hjælp, og her er dine points!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester