Avatar billede drinkit Praktikant
19. februar 2014 - 22:35 Der er 36 kommentarer og
1 løsning

Udtage visse ord fra en String, og oprette objekter.

Hej Arne.

Aftenens sidste, men ret svære spørgsmål, så er jeg færdig med min aflevering (alle 22 opgaver, pyha).

Den her har jeg ingen idé om hvordan jeg skal gribe an.
Kan du lede mig i den rigtige retning?

"Using the classes PhDStudent, TAStudent and Student, write a program that takes as command line argument a String like "TA1 TA3 ST3 TA4 PHD6". This command line has to be interpreted as: TA1 = teaching assistant 1, ST3 = regular student 3, PHD6 = PhD student 6, where the number indicates the position within an array of students, teaching assistants and PhD students. Your application must print out these objects (NOTE: you need to have some pre-stored objects before printing them out; since we cannot deal with files now, simply create some objects, store them into arrays, and then access them)."
Avatar billede arne_v Ekspert
19. februar 2014 - 22:45 #1
String all = "TA1 TA3 ST3 TA4 PHD6";
for(String one : all.split(" ")) {
    // process one her
}
Avatar billede drinkit Praktikant
19. februar 2014 - 22:48 #2
Skal bruge en anelse mere, til hvad jeg gør i hver iteration, hvis du gider?
Så klarer jeg den (måske) derfra, selv :)
Avatar billede arne_v Ekspert
19. februar 2014 - 22:54 #3
String.startsWith kan bruges til at teste de forskelllige prefixer.

String.substring kan hente dele af strengen ud.

Integer.parseInt kan konvertere en streng med et tal til en int.
Avatar billede drinkit Praktikant
20. februar 2014 - 00:24 #4
Tror jeg vil gøre det sådan her:

public void assignStudents(String input) {
  for (String one : input.split(" ")) {
      if (input.startsWith("T")) {
        taArray[Integer.parseInt(one.substring(1, 2))] = one;
      }
  }
}

Men er for træt til at teste det nu - Kigger på det igen i morgen. Sov godt :)
Avatar billede drinkit Praktikant
20. februar 2014 - 00:33 #5
Hmm, ok - nu er jeg kommet så langt, at jeg opdeler den String i 3 forskellige arrays i 3 forskellige klasser.

Men hvordan kalder jeg den så, fra mit program?

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
Student.assignStudents(input); (Skulle kalde ovenstående metode i Student klassen) - Men mine metoder er jo ikke static - Og jeg arbejder jo egentlig ikke med objekter, når jeg bare har en String fra brugerinput, som skal opdeles i Arrays. Jeg er forvirret.

Kan du hjælpe mig med at forstå den del af det?
Avatar billede drinkit Praktikant
20. februar 2014 - 00:39 #6
Arh - og derudover får jeg følgende exception:
Exception in thread "main" java.lang.NullPointerException
at student.Student.assignStudents(Student.java:186)
at student.TestStudent.main(TestStudent.java:103)



linie 186 i Student:   
studentsArray[Integer.parseInt(one.substring(2, 3))] = one;

linje 103 i TestStudent:
System.out.println(student1.assignStudents(input));

Det er vidst ved at være lidt for langt over min sengetid til at lære det her lige nu. :) Checker tilbage i morgen og håber på input fra dig, Arne.
Avatar billede drinkit Praktikant
20. februar 2014 - 00:44 #7
Ok - Exception fik jeg ordnet ved at initialisere min array, så istedet for:

private String[] studentsArray;

så skrev jeg

private String[] studentsArray = new String[100];

så se bort fra den post :)
Avatar billede arne_v Ekspert
20. februar 2014 - 01:04 #8
Jeg taenkte paa noget a la:

  for (String one : input.split(" ")) {
      if (input.startsWith("T")) {
        int v = Integer.parseInt(one.substring(1, 2));
        taArray[v] = new TeachingAssistant();
      }
  }
Avatar billede drinkit Praktikant
20. februar 2014 - 01:09 #9
Er det ikke det samme som jeg har lavet, udover du assigner int v og bruger den til array placeringen istedet?
Avatar billede drinkit Praktikant
20. februar 2014 - 01:18 #10
Irriterende man ikke kan slette sine indlæg som ikke er gennemtænkte. Hehe. Kan godt se det ikke er det samme du gør!
Men forstår ikke helt, du opretter et objekt af en klasse (hvilken - den vi er i?, eller en anden?) -
Avatar billede drinkit Praktikant
20. februar 2014 - 01:29 #11
Arne - Hvorfor kan jeg ikke (når nu jeg gemmer objekter af f.eks. typen Student i mit array) kalde mine Student metoder på de forskellige objekter i arrayet sådan her?:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
System.out.println(student1.assignStudents(input)[3]);


Ps. Smid svar :)
Avatar billede arne_v Ekspert
20. februar 2014 - 01:45 #12
Ifoelge opgavebeskrivelse har du klasser: PhDStudent, TAStudent and Student.

Jeg brugte TeachingAssistant men det skal nok vaere TAStudent.
Avatar billede arne_v Ekspert
20. februar 2014 - 01:48 #13
student1.assignStudents(input)[3]

forstaar jeg ikke

maaske noget a la:

taArray[3].assignStudents(input)

??
Avatar billede arne_v Ekspert
20. februar 2014 - 01:48 #14
og et svar
Avatar billede drinkit Praktikant
20. februar 2014 - 01:54 #15
Ok. Sidste to ting jeg er i tvivl om opsumeret:

nr. 1:

Hvordan kalder jeg metoden (som ikke er static), uden et objekt? Skal jeg bare kalde den på et tilfældigt Student objektiv, som eksempelvis student1 (student1.assignStudents(input)[3]) ?

Og nr. 2.:

Hvorfor kan jeg ikke kalde mine Student metoder på det Student objektiv der ligger i arrayet på plads 3?

student1.assignStudents(input)[3].getName();

Når jeg prøver dette^ - Så giver den en nullpointer exception.

i for loopet, laver jeg objektet, ligesom du viste mig (Med det korrekte data som de forskellige parametre:
studentsArray[v] = new Student("Navn", "Klasse", "Køn", int JavaProfeciency, int CprNummer);
Avatar billede drinkit Praktikant
20. februar 2014 - 01:57 #16
problemet er, at jeg har lavet de forskellige arrays: taArray, phdArray og studentArray i de forskellige klasser - Så jeg kan ikke kalde den på den måde i min main.

Skal de forkellige arrays ikke være i de tilsvarende klasser?
Avatar billede arne_v Ekspert
20. februar 2014 - 01:59 #17
student1.assignStudents(input)[3].getName()

forventer at student1 er et objekt som har en metode assignStudents der returnerer et array med 4 elementer som alle har en getName metode.

Det lyder lidt mystisk.
Avatar billede arne_v Ekspert
20. februar 2014 - 02:00 #18
Du skal have et objekt for at kalde en ikke statisk metode.

taArray skal ikke vaere i TAStudent men i en anden klasse evt. som lokal variabel i main.
Avatar billede drinkit Praktikant
20. februar 2014 - 02:01 #19
TestStudent class:

Student student1 = new Student("Mikael van Ark", "SDT", "Female", 6, 1601881527);

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
System.out.println(student1.assignStudents(input)[3].getName());

Student class:

private Student[] studentsArray = new Student[100]; 

public Student[] assignStudents(String input) {
  for (String one : input.split(" ")) {
      if (input.startsWith("ST")) {
        int v = Integer.parseInt(one.substring(1, 2));
        studentsArray[v] = new Student("test", "test", "test", 1, 1);
      }
  }
  return studentsArray;
}
Avatar billede drinkit Praktikant
20. februar 2014 - 02:07 #20
Ok, så jeg kan godt se din pointe at den her ikke går:
System.out.println(student1.assignStudents(input)[3].getName());

Men jeg er overbevist om, at jeg er rimelig gal på den, hvad angår hvor mit Students array skal være, og hvordan jeg i mit for loop kan smide Student objekter ind i et array der tilsyneladende er i en anden klasse.

Vil det sige at assignStudents metoden faktisk også skal være i main? Og så oprette forskellige objekter i forskellige arrays, alt efter hvilke bogstaver den String brugeren intaster indeholder?

JA! Tror jeg har den? ^
Avatar billede arne_v Ekspert
20. februar 2014 - 02:13 #21
Det giver mere mening.
Avatar billede arne_v Ekspert
20. februar 2014 - 02:15 #22
Listen med alle studerende er ikke en egenskab ved en enkelt studerende.

Det er en egenskab ved konteksten.

Saa medmindre du har en klasse UddannelsesInstitutiion som har en liste med alle studerende, saa hoerer den hjemme i dit program.
Avatar billede drinkit Praktikant
20. februar 2014 - 02:18 #23
Tror jeg nærmer mig noget der en dag kommer til at virke!
Får nu følgende exception:

Exception in thread "main" java.lang.NumberFormatException: For input string: "A"
at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at student.TestStudent.main(TestStudent.java:118)

Linje 118 er int v = Integer.parseInt(one.substring(1, 2)); under TA if'en.

--------

I min main har jeg nu følgende:

        Student[] studentsArray = new Student[100];
        Student[] phdsArray = new Student[100];
        Student[] tasArray = new Student[100];

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();

        for (String one : input.split(" ")) {
            if (input.startsWith("ST")) {
                int v = Integer.parseInt(one.substring(1, 2));
                studentsArray[v] = new Student(one, one, one, 1, 1);
            }
            if (input.startsWith("PHD")) {
                int v = Integer.parseInt(one.substring(2, 3));
                phdsArray[v] = new Student(one, one, one, 1, 1);
            }
            if (input.startsWith("TA")) {
                int v = Integer.parseInt(one.substring(1, 2));
                tasArray[v] = new Student(one, one, one, 1, 1);
            }
        }

        System.out.println(Arrays.toString(tasArray));
        System.out.println(Arrays.toString(tasArray));
        System.out.println(Arrays.toString(phdsArray));
Avatar billede arne_v Ekspert
20. februar 2014 - 02:22 #24
.substring(1, 2)

skal nok vaere

.substring(2, 3)

T - 0
A - 1
1 - 2
  - 3
Avatar billede arne_v Ekspert
20. februar 2014 - 02:24 #25
.substring(2, 3)

betyder substring hvor

2 <= index < 3
Avatar billede arne_v Ekspert
20. februar 2014 - 02:26 #26
Jeg haaber ikke at du skal tiidligt op i morgen.

:-)
Avatar billede drinkit Praktikant
20. februar 2014 - 02:31 #27
Hehe, den skal først afleveres inden kl. 12 formiddag i morgen, så jeg tror jeg klarer den. Det her er sidste opgave :)

Men. Nu får jeg ingen exception - Men den printer 3 arrays, fyld med NULL - Altså, den har ikke puttet objekterne ind i arraysne :(

?



Student[] studentsArray = new Student[100];
TAStudent[] tasArray = new TAStudent[100];
PhDStudent[] phdsArray = new PhDStudent[100];

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();

for (String one : input.split(" ")) {
  if (input.startsWith("ST")) {
      int v = Integer.parseInt(one.substring(2, 3));
      studentsArray[v] = new Student(one, one, one, 1, 1);
  }
  if (input.startsWith("PHD")) {
      int v = Integer.parseInt(one.substring(3, 4));
      phdsArray[v] = new PhDStudent(one, one, one, 1, 1);
  }
  if (input.startsWith("TA")) {
      int v = Integer.parseInt(one.substring(2, 3));
      tasArray[v] = new TAStudent(one, one, one, 1, 1);
  }
}

System.out.println(Arrays.toString(tasArray));
System.out.println(Arrays.toString(tasArray));
System.out.println(Arrays.toString(phdsArray));
Avatar billede arne_v Ekspert
20. februar 2014 - 02:40 #28
proev:

for (String one : input.split(" ")) {
  if (input.startsWith("ST")) {
      int v = Integer.parseInt(one.substring(2, 3));
      studentsArray[v] = new Student(one, one, one, 1, 1);
  }
  if (input.startsWith("PHD")) {
      int v = Integer.parseInt(one.substring(3, 4));
      phdsArray[v] = new PhDStudent(one, one, one, 1, 1);
  }
  if (input.startsWith("TA")) {
      int v = Integer.parseInt(one.substring(2, 3));
      tasArray[v] = new TAStudent(one, one, one, 1, 1);
  }
}

->

for (String one : input.split(" ")) {
  if (input.startsWith("ST")) {
      int v = Integer.parseInt(one.substring(2, 3));
      studentsArray[v] = new Student(one, one, one, 1, 1);
  } else if (input.startsWith("PHD")) {
      int v = Integer.parseInt(one.substring(3, 4));
      phdsArray[v] = new PhDStudent(one, one, one, 1, 1);
  } else if (input.startsWith("TA")) {
      int v = Integer.parseInt(one.substring(2, 3));
      tasArray[v] = new TAStudent(one, one, one, 1, 1);
  } else {
      System.out.println("Can not parse : " + one);
  }
}
Avatar billede drinkit Praktikant
20. februar 2014 - 02:44 #29
Giver ingen mening.. NumberFormatException igen?

Exception in thread "main" java.lang.NumberFormatException: For input string: "D"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at student.TestStudent.main(TestStudent.java:116)


på samme linie igen.. Under TA if'en.

int v = Integer.parseInt(one.substring(2, 3));
Avatar billede drinkit Praktikant
20. februar 2014 - 02:46 #30
og input jeg bruger, er som beskrevet i spørgsmålet øverst:

TA1 TA3 ST3 TA4 PHD6
Avatar billede arne_v Ekspert
20. februar 2014 - 02:48 #31
} else if (input.startsWith("PHD")) {
      int v = Integer.parseInt(one.substring(3, 4));

er ikke blevet til:

} else if (input.startsWith("PHD")) {
      int v = Integer.parseInt(one.substring(2, 3));

ved et lille "uheld"?
Avatar billede drinkit Praktikant
20. februar 2014 - 02:49 #32
Copy paste fra netbeans siger nej.

        for (String one : input.split(" ")) {
            if (input.startsWith("ST")) {
                int v = Integer.parseInt(one.substring(2, 3));
                studentsArray[v] = new Student(one, one, one, 1, 1);
            } else if (input.startsWith("PHD")) {
                int v = Integer.parseInt(one.substring(3, 4));
                phdsArray[v] = new PhDStudent(one, one, one, 1, 1);
            } else if (input.startsWith("TA")) {
                int v = Integer.parseInt(one.substring(2, 3));
                tasArray[v] = new TAStudent(one, one, one, 1, 1);
            } else {
                System.out.println("Can not parse : " + one);
            }
        }
Avatar billede drinkit Praktikant
20. februar 2014 - 02:50 #33
For input string: "D" siger den i fejlmeddelelsen? Hvad betyder det
Avatar billede drinkit Praktikant
20. februar 2014 - 02:52 #34
Det er som om den prøver at parse d til int, selvom PHD6 jo ikke starter med TA? Jeg forstår det ikke.
Avatar billede arne_v Ekspert
20. februar 2014 - 02:53 #35
Den siger at Integer.parseInt doer fordi one.substring returnerer "D"
Avatar billede arne_v Ekspert
20. februar 2014 - 02:54 #36
Det er faktisk min fejl.

:-(

if (input.startsWith("ST")) {

skal vaere:

if (one.startsWith("ST")) {

o.s.v.
Avatar billede drinkit Praktikant
20. februar 2014 - 03:05 #37
AHh ja, selvfølgelig. Fordi, input starter jo altid med TA.

Ok, det ser faktisk ud som om det virker præcis som det skal. SKØNT!!

Vi fik lov til at bruge stackoverflow - Men det er nu alligevel nemmere og hyggeligere på dansk :)

Sov rigtig godt (Det kommer jeg i hvert fald til :))

Vi skrives nok herinde i fremtiden - Når nu mit android semester snart starter, hehehehe.

Igen, 1.000 tak for din hjælp! Jeg har lært virkelig meget i dag.
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