subList

Status
Nicht offen für weitere Antworten.
M

mausi

Gast
Wie kann ich so eine Funktion implementieren in java
Code:
public static boolean subList(ListT list, ListT sublist) {
      // Ergaenzen !!
      return true;
  } //subList
 

foobar

Top Contributor
Was sillst du denn berechnen? Geht es darum festzustellen, ob eine Liste eine Subliste einer anderen Liste ist?

Code:
public static boolean isSubList(ListT list, ListT sublist) 
{
     return list.containsAll( sublist );
}
 
M

mausi

Gast
genau die main sieht so aus
Code:
public class SubListMain {

  /**
   * @param argv - Parameter bei Programmstart
   */
  public static void main(String[] argv) {
    stdin eingabe = new stdin();
    ArrayListT l1 = new ArrayListT();
    ArrayListT l2 = new ArrayListT();
    int zahl;
    for (int i = 0; i < 7; i++) {
      zahl=eingabe.getInt("Eingabe einer Zahl der Liste: ");
      l1.append(new IntElemT(zahl));
    } // for
    for (int i = 0; i < 4; i++) {
      zahl=eingabe.getInt("Eingabe einer Zahl der Subliste: ");
      l2.append(new IntElemT(zahl));
    } // for
    
    if (ListOperations.subList(l1,l2)) {
      System.out.println("Die Liste "+l2.toString()+ " ist eine SubListe von "
        +l1.toString());
    } else {
      System.out.println("Die Liste "+l2.toString()+ " ist keine SubListe von "
        +l1.toString());
    } // if

  } // main

} // class PurgeMain
ArrayLisT ist schon implementiert und hat die Funktionen
Teilalgorithmen:
· append - fügt ein neues Element ans Ende der Liste
· clear - entfernt alle Elemente aus der Liste
· connect - eine zweite Liste wird angehangen
· copy - liefert Tiefenkopie
· equals - Test auf Gleichheit
· getIterator - liefert einen Iterator für die Liste
· delete - löscht das Element, auf welches der Iterator zeigt
· insert - fügt Element e vor das Element, auf das der Iterator it zeigt, ansonsten am Ende
· isEmpty - liefert true, gdw. die Liste kein Element enthält
· length - liefert die Anzahl der Elemente
· less - Test auf „Kleiner“
· locate - setzt Iterator auf das erste Vorkommen von e in der Liste
· replace - ersetzt das Element, auf das it zeigt, durch e
· retrieve - liefert Datenkomponente des Elementes, auf das der Iterator zeigt
· toString - Ausgabekonvertierung
Interne Klassen:
· first - richtet n auf das erste Element
· last - richtet n auf das letzte Element
· hasMore - liefert true gdw. der n auf ein Element zeigt
· next – richtet n auf Nachfolgeelement
· hasPrev - liefert true gdw. n auf Element zeigt und dessen Vorgänger existiert
· prev - richtet n auf vorheriges Element
· copy - liefert neuen Iterator, der auf selbes Element wie n gerichtet ist
· setToIndex – richtet n auf das i-te Element
 

Wildcard

Top Contributor
Wenn du AbstractCollection erweiterst ist diese Methode schon vorhanden.
Wenn nicht, sie sieht so aus:

Code:
    public boolean containsAll(Collection c) {
	Iterator e = c.iterator();
	while (e.hasNext())
	    if(!contains(e.next()))
		return false;

	return true;
    }

    public boolean contains(Object o) {
	Iterator e = iterator();
	if (o==null) {
	    while (e.hasNext())
		if (e.next()==null)
		    return true;
	} else {
	    while (e.hasNext())
		if (o.equals(e.next()))
		    return true;
	}
	return false;
    }
 
M

mausi

Gast
hmmm....

Code:
public static boolean subList(ListT list, ListT sublist) {
      IteratorT it3 = list.getIterator(); // Iterator erstellen der auf Liste1 zeigt
      IteratorT it4 = sublist.getIterator(); // Iterator der auf Liste2 zeigt
      }
so und nu wie weiter???oder brauch ich nur einen Iterator???
 
M

mausi

Gast
Code:
  public static boolean subList(ListT list, ListT sublist) {
      IteratorT it3 = list.getIterator();
      IteratorT it4 = sublist.getIterator();
      it3.first();  //zeigt aufs erste Element der Liste
      it4.first();  //zeigt aufs erste Element der Subliste
    for (int i = 0; i < list.length(); i++) {      
      while (it3.hasMore() && it4.hasMore()) {
          if (list.retrieve(it3).equals(sublist.retrieve(it4))) {
              it3.next();
              it4.next();
          }//if
      }//while
  }//for
      
  
      return true;
  } //subList
was s hier noch falsch???
 
B

bygones

Gast
es wäre wesentlich besser zu wissen - was nicht geht... macht ers nur falsch, exception oder wie....

ich tippe mal ins blaue rein: lass dir for schleife weg - du läust list.length mal über die iteratoren... d.h. bei i == 1 dürfte nichts mehr passieren

v.a. du gibst immer true zurück, egal was auch passiert....
 
M

mausi

Gast
Code:
  public static boolean subList(ListT list, ListT sublist) {
      IteratorT it3 = list.getIterator();
      IteratorT it4 = sublist.getIterator();
      it3.first();  //zeigt aufs erste Element der Liste
      it4.first();  //zeigt aufs erste Element der Subliste
    //for (int i = 0; i < list.length(); i++) {      
      while (it3.hasMore() && it4.hasMore()) { //liefert true gdw. der Iterator auf ein Element zeigt 
          if (list.retrieve(it3).equals(sublist.retrieve(it4))) {//liefert Datenkomponente des Elementes, auf das der Iterator zeigt
              it3.next();//richtet den Iterator auf Nachfolgeelement,
              it4.next();
          }//if
           else {
              return false;
           }               
      }//while
 // }//for
na so is die ausgabe
>java SubListMain
Eingabe einer Zahl der Liste: ? 1
Eingabe einer Zahl der Liste: ? 2
Eingabe einer Zahl der Liste: ? 3
Eingabe einer Zahl der Liste: ? 4
Eingabe einer Zahl der Liste: ? 5
Eingabe einer Zahl der Liste: ? 6
Eingabe einer Zahl der Liste: ? 7
Eingabe einer Zahl der Subliste: ? 1
Eingabe einer Zahl der Subliste: ? 2
Eingabe einer Zahl der Subliste: ? 3
Eingabe einer Zahl der Subliste: ? 4
Die Liste <1, 2, 3, 4> ist eine SubListe von <1, 2, 3, 4, 5, 6, 7>
>Exit code: 0
aber:
>java SubListMain
Eingabe einer Zahl der Liste: ? 1
Eingabe einer Zahl der Liste: ? 2
Eingabe einer Zahl der Liste: ? 3
Eingabe einer Zahl der Liste: ? 4
Eingabe einer Zahl der Liste: ? 5
Eingabe einer Zahl der Liste: ? 6
Eingabe einer Zahl der Liste: ? 7
Eingabe einer Zahl der Subliste: ? 2
Eingabe einer Zahl der Subliste: ? 3
Eingabe einer Zahl der Subliste: ? 4
Eingabe einer Zahl der Subliste: ? 5
Die Liste <2, 3, 4, 5> ist keine SubListe von <1, 2, 3, 4, 5, 6, 7>
>Exit code: 0
also irgend ne schleife fehlt schon noch
 
B

bygones

Gast
du vergleichst falsch... du schiebst beide iteratoren immer gleichzeitig weiter, dadurch vergl. du nur direkte "nachbarn"...
d.h. bei 1,2,3,4 als Liste würdest du nur 1,2,3 z.b. als sublist finden, aber nicht 3,4

d.h. du musst für jedes element in der sublist einmal komplett über die list laufen lassen. dann vergleichst du das aktuelle element aus der sublist mit jedem aus der liste. wenn sie gleich sind erhöhst du eine temp. variable (int). am schluss vergleichst du ob diese variable gleich der länge ger sublist ist...

eine möglichkeit
 

Bleiglanz

Gesperrter Benutzer
mach eine public methode "contains(Object o)", die true oder false liefert je nach dem ob o in der Liste vorhanden ist


-> für deine Funktion nimmst du dann einen Iterator (für die Sublist) und prüft für jedes Element der sublist, ob es auch in der anderen Liste vorkommt

wenn eins nicht vorkommt: break oder ähnlichens und return false

wenn alle vorkommen return true (am ende)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben