Teil-Array

Status
Nicht offen für weitere Antworten.

flashdog

Bekanntes Mitglied
Hallo,
ich habe ein Array und ein Teil-Array. Das größere Array beinhaltet das Teil-Array. Das folgende Programm findet die Index Position an welcher stelle das Teil-Array in dem größeren Array beginnt.

Java:
public class FindeIndex {
	public static int findeIndexPos(int arr1[] , int arr2[]){
		int pos = 0;
		
		System.out.print("Array: ");
		for(int i : arr1){
			System.out.print(i + " ");
		}
		
		System.out.print("\nTeilarray: ");
		for(int i : arr2){
			System.out.print(i + " ");
		}
		System.out.println();
		
		for (int i = 0; i < arr1.length; i++){
			if (arr1[i] == arr2[0]){
				System.out.print("Ergebnis: " + i);
				break;
			}				
		}
		return pos;
	}

	public static void main(String[] args) {
		int tArray1[] = {3, 4, 6, 7, 8};
		int tArray2[] = {6, 7};

		findeIndexPos(tArray1, tArray2);
	}
}
Ausgabe:
Code:
Array: 3 4 6 7 8 
Teilarray: 6 7 
Ergebnis: 2

Das obere Programm hat aber zwei Probleme. Der erste ist, dass ich davon ausgehe, dass es wirklich ein Teil-Array ist da ich nicht weiss wie man das testen kann.
Das zweite Problem ist, dass ich nur die erste Index Postion in dem größeren Array für den beginn des Teil-Arrays annehme, aber dies ist keine Garantie für den beginn des Teil-Arrary im Arrary.

Wie kann man die zwei Probleme beheben und mit Sicherheit festellen ab welcher stelle der Teil-Array im größeren Array beginnt?

Viele Grüße
 

faetzminator

Gesperrter Benutzer
ich würde folgendes vorschlagen, die Laufzeit beträgt Worstcase aber leider O(n*m):
Java:
public static int findeIndexPos(int arr1[], int arr2[]) {
    boolean isCorrect;
    for (int i = 0; i < arr1.length - arr2.length; i++) {
        isCorrect = true;
        for (int j = 0; j < arr2.length; j++) {
            if (arr1[i + j] != arr2[j]) {
                isCorrect = false;
                break;
            }
        }
        if (isCorrect) {
            return i;
        }
    }
    return -1;
}
 

flashdog

Bekanntes Mitglied
Leider funktioniert JUnit bei mir nicht. Ich habe extra falsche erwartugswerte angeben, aber trotzdem läuft der Test fehlerfrei durch:
Java:
import junit.framework.*;

public class TestFindeIndex extends TestCase {
	FindeIndex f;

	public TestFindeIndex(String name) {
		super(name);
	}

	public void setUp(){
		f=new FindeIndex();
	}

	public static Test suite() {
		return new TestSuite(TestFindeIndex.class);
	}

	public void test1() {
		int tArray1[] = {3, 4, 6, 7, 8};
		int tArray2[] = {6, 7};
		
		assert(f.findeIndexPos(tArray1, tArray2) == 1); // richtig waere 2
	}

	public void test2() {
		int tArray1[] = {3, 6, 4, 6, 7, 8};
		int tArray2[] = {6, 7};
		
		assert(f.findeIndexPos(tArray1, tArray2) == 1); // richtig waere 3
	}
	
	public static void main(String args[]) {
		junit.textui.TestRunner.run(suite());
	}
}

Was habe ich falsch gemacht?
 
B

bygones

Gast
versuch dir aber anzugewoehnen mit JUnit4 zu arbeiten...

weiterhin kannst du dir mal Hamcrest anschauen - das macht das matchen bzw assert um einiges verstaendlicher
 

Landei

Top Contributor
Ich schlage eine andere Implementierung vor:

Java:
  public static int indexOf(int[] ps, int[] qs) {
    if (ps.length < qs.length) {
      return -1;
    }
    int qsum = 0;
    for(int q : qs) {
      qsum += q; 
    }
    int psum = 0;
    for(int i = 0; i < qs.length; i++) {
      psum += ps[i];
    }
    for(int i = 0; i < ps.length - qs.length; i++) {
      if (i > 0) {
        psum += ps[i+qs.length] - ps[i-1];
      }
      if(psum == qsum) {
        boolean found = true;
        for(int k = 0; k < qs.length; k++) {
          if (qs[k] != ps[k + i]) {
            found = false;
            break;
          }
        }
        if(found) {
          return i;
        }
      }
    }
    return -1;    
  }

Dabei werden die Stellen, die "genauer untersucht werden" anders bestimmt. Während im Original geschaut wurde, ob die beiden Anfangswerte gleich sind, schaue ich nach, ob die Summe der Teil-Sequenz mit der Summe der gesuchten Sequenz übereinstimmt. Ich denke, dass man damit in der Praxis besser fährt, weil mehr Informationen in die Berechnung eingehen (es lassen sich aber bestimmt Beispiele mit gleichem Worst-Case-Verhalten konstruieren). Die Berechnung erfolgt "gleitend", also um das "Sequenz-Fenster" um eins zu verschieben, ziehe ich den alten Anfangswert ab und addiere den neuen Endwert dazu.
 
B

bygones

Gast
Ich dachte ich habe JUnit 4 verwendet. Wie würde es in JUnit 4 aussehen?
Junit4 arbeitet mit Annotations
Java:
public class TestFindeIndex {
    private FindeIndex f;
    
    @Before 
    public void setUp(){
        // wird vor jedem test aufgerufen
        f=new FindeIndex();
    }
 
    @Test
    public void test1() {
       // test
    }
 
    @Test
    public void test2() {
        // test
    }

}
 

flashdog

Bekanntes Mitglied
Netbeans hat mir Junit 4 vorbereit und ich habe nur
int[] arr1 = {3, 4, 6, 7, 8};
int[] arr2 = {6, 7};
int expResult = 2;
deklaliert, aber leider läuft der Test nicht Fehlerfrei ab.

Java:
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;


public class FindeIndexTest {

  public FindeIndexTest() {
  }

  @BeforeClass
  public static void setUpClass() throws Exception {
  }

  @AfterClass
  public static void tearDownClass() throws Exception {
  }

  @Before
  public void setUp() {
  }

  @After
  public void tearDown() {
  }

  /**
   * Test of findeIndexPos method, of class FindeIndex.
   */
  @Test
  public void testfindeIndexPos() {
    System.out.println("findeIndexPos");
    int[] arr1 = {3, 4, 6, 7, 8};
    int[] arr2 = {6, 7};
    int expResult = 2;
    int result = FindeIndex.findeIndexPos(arr1, arr2);
    assertEquals(expResult, result);
    // TODO review the generated test code and remove the default call to fail.
    fail("The test case is a prototype.");
  }
  /**
   * Test of main method, of class FindIndex.
   */
//  @Test
//  public void testMain() {
//    System.out.println("main");
//    String[] args = null;
//    FindeIndex.main(args);
//    // TODO review the generated test code and remove the default call to fail.
//    fail("The test case is a prototype.");
//  }
}

Was habe ich vergessen?
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
U Kann man in Java ein Array zum Teil vorbelegen? Java Basics - Anfänger-Themen 4
G Area mit Teil-Image füllen Java Basics - Anfänger-Themen 0
R Audio kann nur zum Teil gestoppt werden Java Basics - Anfänger-Themen 1
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Java Sternchen ausgabe teil 2 Java Basics - Anfänger-Themen 20
G Teil einer String speichern Java Basics - Anfänger-Themen 4
F Abstrakte Klasse doch zum "Teil" instanzieren? Java Basics - Anfänger-Themen 4
J Bestimmter Teil aus Zeichenfolge Java Basics - Anfänger-Themen 2
S Text in einem JLabel nur zum Teil Fett Java Basics - Anfänger-Themen 2
M bestimmten Teil eines Strings entfernen Java Basics - Anfänger-Themen 4
D Wie den HTML-Teil des Chat Tutorials aus dem FAQ-Bereich starten? Java Basics - Anfänger-Themen 5
S Methoden Textdatei Teil String auslesen Java Basics - Anfänger-Themen 3
C bestimmten Teil von string removen Java Basics - Anfänger-Themen 4
C [Sammelthread] Fragen zu Quaxlis Tutorial Teil 1 Java Basics - Anfänger-Themen 8
D p q formel gibt zum Teil falsche Werte aus Java Basics - Anfänger-Themen 5
S Filelist Ausgabe (nur den letzten teil) Java Basics - Anfänger-Themen 8
R Teil eines Strings übertragen Java Basics - Anfänger-Themen 3
C Verzweigung Teil 2 Java Basics - Anfänger-Themen 13
W Datentypen Auswertung von Ausdrücken (Teil 1) Java Basics - Anfänger-Themen 7
2 Mehrfachvergleich Teil von String Java Basics - Anfänger-Themen 5
S Teil derGUI zeigt sich erst später Java Basics - Anfänger-Themen 2
B Teil eines Bild kopieren bei verschiedenen Zoomstufen Java Basics - Anfänger-Themen 3
C Verstehe Code-Teil nicht. Java Basics - Anfänger-Themen 2
S Passwortgeschützter Text Teil 3 Java Basics - Anfänger-Themen 6
S Passwortgeschützter Text Teil 2 Java Basics - Anfänger-Themen 27
C Teil Problem Java Basics - Anfänger-Themen 11
T Teil eines Strings farbig gestalten Java Basics - Anfänger-Themen 10
G " als Teil von Strings verwenden Java Basics - Anfänger-Themen 9
R Teil eines Arrays übergeben Java Basics - Anfänger-Themen 1
G Teil eines Files einlesen und vergleichen Java Basics - Anfänger-Themen 4
G Teil im Code überspringen. Java Basics - Anfänger-Themen 3
M 2 Fragen: Vergleich, aber wie? Was passiert in diesem Teil? Java Basics - Anfänger-Themen 18
S neuer String zur jedem Teil von List Java Basics - Anfänger-Themen 2
G If-Abfrage, die nur einen Teil eines Strings vergleicht Java Basics - Anfänger-Themen 3
B Frage zum Tutorial "JTable - Teil 5 - Verändern von Dat Java Basics - Anfänger-Themen 6
S Teil eines Strings ermitteln Java Basics - Anfänger-Themen 2
V Teil eines Programms funktioniert einfach nicht Java Basics - Anfänger-Themen 2
G benötige nur einen teil eines strings Java Basics - Anfänger-Themen 7
K Datei lesen und nur zum Teil wieder ausschreiben Java Basics - Anfänger-Themen 2
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben