filecontentheader search

Trümmermacher

Bekanntes Mitglied
Hi Leute,

ich habe eine Klausuraufgabe bei der ich einfach nicht auf die Lösung kommme.
Ich weiss das ich den String array durchsuchen muss und wenn beide Strings enthalten sind die postitive nachricht zurückgeben muss.Aber ich frage mich wie ich die Werte daraus extrahieren soll und wie ich die Zeile vergleichen soll wenn ich nur den Header Namen kenne aber nicht den Wert.

Java:
public class filecontentheader {
  

public filecontentheader (String [] h){
    this.header=h;
}
    String falsch = "das geht nicht ";
    String richtig = "das geht";
    String [] header ;
  
  
    public String fileContent(String[] header){
    String check= "das geht nicht";

  
        for (int i= 0; i<header.length ;i++){
        if(header[i] == "Content-Length" )
            System.out.println(header[i]);
       
        check ="das geht";
        System.out.println(check);
        }
            return check;
        }
}
 

Anhänge

  • 10847401_354772361384379_4465514500827095165_o.jpg
    10847401_354772361384379_4465514500827095165_o.jpg
    205,3 KB · Aufrufe: 26
Zuletzt bearbeitet von einem Moderator:

Enceladus271

Bekanntes Mitglied
Zunächstmal: Strings vergleicht man nicht mit == sondern mit equals.
Allerdings interessieren dich ja nicht die Strings die gleich "Content-Length" sind, sondern die, die so beginnen. Also korrekt wäre
Java:
if(header[i].startsWith("Content-Length:"))

Wenn du die passende Header-Zeile gefunden hast, kannst du mit den String-Methoden lenght und substring arbeiten um die Information zu extrahieren. Alternativ könnte man mit Pattern arbeiten wenn ihr sowas schon hattet.
 
Zuletzt bearbeitet von einem Moderator:

Trümmermacher

Bekanntes Mitglied
Ich verstehe aber 2 sachen nicht ich kann ja nicht von einem String Array einen Substring machen . Und wie kann sagen das eine zusätzlich if bedingung machen um zu sagen das es auch noch "Content-Type" in dem String Array vorhanden sein muss
 

JStein52

Top Contributor
Warum nicht einfach und schmerzlos:

Java:
    public String fileContent(String[] header) {
        boolean contentLength = false;
        boolean contentType   = false;
   
        for (int i = 0; i < header.length; i++) {
            if (header[i].startsWith("Content-Length:")) {
                contentLength = true;
                // hier noch den Wert extrahieren, z.B. length = Integer.parseInt(header[i].substring("Content-Length:".length())
            }
            else if (header[i].startsWith("ContentType:")) {
                contentType = true;
                // hier wieder den Wert extrahieren
            }
       
            if (contentLength && contentType) { // sobald beide gefunden sind machst du was
                return "The response contains ....";
            }
        }
        return "The response does not contain";
    }

Edit: die Werte sollen ja noch extrahiert werden, habe ich noch in Kommentaren eingefügt.
 
Zuletzt bearbeitet von einem Moderator:

Trümmermacher

Bekanntes Mitglied
Ich hab es jetzt so gelöst funktioniert auch nur ich frage mich ob mein check überhaupt noch in verbindung mit den if anweisungen steht

Java:
public class filecontentheader {
public filecontentheader (String [] h){
    this.header=h;
}
 
    String [] header ;
    String Content;
    String Type;
    public String fileContent(String[] header){
    String check= "das geht nicht";

        for (int i= 0; i<header.length ;i++){
         
            if(header[I].startsWith("Content-Length"))
                Content = header[I].substring(header[I].indexOf(":")+1,header[I].length());
            if(header[I].startsWith("Content-Type"))
               Type =header[I].substring(header[I].indexOf(":")+1,header[I].length());
            check ="das geht";
        }
          
        System.out.println(Content);
        System.out.println(Type);
        System.out.println(check);
      
            return check;
}
}
 
Zuletzt bearbeitet von einem Moderator:

JStein52

Top Contributor
Nein, das wird nicht funktionieren. dein check wird jetzt in jedem Schleifendurchlauf auf "Das geht" gesetzt. Und die Werte extrahierst du als String !! Beim Type wahrscheinlich richtig. Bei der Länge weiss ich nicht ? Steht das so in der Aufgabe ?

Und wenn es Content-Length schon ist kannst du dir natürlich den zweiten If sparen, also else if !! Kommt bei Klausuren sicher gut !
 

Trümmermacher

Bekanntes Mitglied
ja die werte werden ja als string extrahiert steht ja nicht wie man es extrahieren soll.

aber das mit dem check hab ich mir schon gedacht ...aber ist es nur falsch verschachtelt oder wird es letz endlich besser sein es so zu machen wie du es gemacht hast.
 

JStein52

Top Contributor
Du hast ja zwei Bedingungen die beide erfüllt sein müssen. Und das musst du irgendwie abbilden. Scheint mir am einfachsten mit zwei Bool'schen Werten. Und wie gesagt, ein bisschen optimieren kannst du wenn du in dem Fall dass du das eine gerade gefunden hast nicht gleich dahinter prüfst ob es auch das andere ist. Das kann nicht sein. Und du kannst die Schleife abbrechen wenn du beide gefunden hast. Beim Rest hast du natürlich recht, wenn nicht angegeben ist wie du es extrahierehn sollst ist deines genau so richtig. Und dann natürlich auch noch die geforderten Return-Werte beachten, aber das weisst du ja selber.
 

Trümmermacher

Bekanntes Mitglied
ja ich hab es jetzt mit else if überarbeitet und das check aus der schleife rausgenommen .und das mit den return-werten wird jetzt noch eingefügt mit dem check war ja erstmal nur für mich um zusehen ob alles klappt.Jetzt kommt das Feintuning

Vielen Dank für die Hilfe
 

Trümmermacher

Bekanntes Mitglied
SO JStein52 ich habe deine Code verwendet und er funktioniert nicht richtig .Denn es wird das falsche ergebnis zurück gegeben und eine else if anweisung zu verwenden ist in dem fall nciht richtig meiner meinung nach.
Da dadurch nur die eine oder die andere if Anweisung durchgeführt wird und niemals beide .

Hier meine Lösung in der der Wert als STring ausgegbenen wird:

Java:
public class filecontentheader {
   public filecontentheader(String[] h) {
     this.header = h;
   }

   String[] header;
   String Content;
   String Type;
   public String fileContent(String[] header) {
     String check = "das geht nicht";
     boolean pro = false;
     boolean neg = false;

     for (int i = 0; i < header.length; i++) {
       if (header[i].startsWith("Content-Length")) {
         pro = true;
         Content = header[i].substring(header[i].indexOf(":") + 1, header[i].length());
       }
       if (header[i].startsWith("Content-Type")) {
         neg = true;
         Type = header[i].substring(header[i].indexOf(":") + 1, header[i].length());
       }
       if (pro && neg == true) {
         check = "das geht ";
       }
     }
     System.out.println(Content);
     System.out.println(Type);
     System.out.println(check);
     return check;
   }
}
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Also: "else if" ist genau der richtige Ansatz, denn du hast pro Zeile nur einen Eintrag, das heißt es wird nie gleichzeitig "Content-Length" und "Content-Type" in einem String stehen.

Paar Punkte, die ich jedem sage:
  • Klassennamen in UpperCamelCase
  • Variablen-/Methodennamen in lowerCamelCase
  • Bei <string>.substring(startPoint) kannst du dir den zweiten Parameter sparen, da er die Länge per default nimmt
  • (pro && neg == true) kann verkürzt werden auf (pro && neg) weil es ja ein boolscher Ausdruck ist
  • Statt immer mit dem Index auf das Array zuzugreifen, verwendet man eine for-Each Schleife for(String line : header) {...}
Also der Code sieht ja eigentlich gut aus, was funktioniert denn nicht?
 

Trümmermacher

Bekanntes Mitglied
Hi Flown

ich danke dir für deine Tipps .
Also um das richtig zu verstehen wenn eine if anweisung in einem block steht ist es egal ob die nächste mit if else beginnt da jeder block für sich steht werden beide ausgeführt ???

Und war die Frage was an meinem Code oder an Jstein nicht funktioniert ???
Denn mein Code funktioniert :D
 

Flown

Administrator
Mitarbeiter
Also wenn:
Java:
if (...) {
}
if (...) {
}
steht, werden beide Blöcke überprüft und eventuell beide ausgeführt.

Wenn aber:
Java:
if(...) {
} else if(...) {
}
steht, dann wird nur nach der ersten wahren Bedingung gesucht und dessen Block ausgeführt.

Da du ja weißt, dass in einer Zeile entweder "Content-Length" oder "Content-Type" steht, kannst du getrost if - elseif verwenden.

Was funktioniert denn bei @JStein52 seinem Programm nicht bzw. was macht deins jetzt anders?
 

JStein52

Top Contributor
Meintest du mit "funktioniert nicht ... " dass ich beim zweiten startsWith den Bindestrich in Content-Type: vergessen hatte ?? Ich dachte mir das erledigst du im Feintuning
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Ähnliche Java Themen

Neue Themen


Oben