Die letzten 10 Beiträge |
eulerscheZahl |
Hm, das habe ich übersehen
Danke für die Rückmeldung. |
Shizmo |
Hmm interessant du hast recht, allerdings lag der Fehler wo anders.
Das Problem lag an add & div der DNA-Klasse, hier mal die add:
Vorher:
code: |
1:
2:
3:
4:
|
public Vector add(Vector v){
this.dna = this.dna + ((DNA)v).dna;
return this;
} |
|
Jetzt:
code: |
1:
2:
3:
|
public Vector add(Vector v){
return new DNA(this.dna + ((DNA)v).dna);
} |
|
Dadurch, dass ich es zwischengespeichert habe, hat es beim mehreren Aufrufen von add und average zu Fehlergebnissen gefuehrt. Mit direktem Return hat es funktioniert.
Vielen Dank nochmal fuer deine Hilfe!! |
eulerscheZahl |
Mal ein einfaches Beispiel:
du willst GTAGC mit div(2) aufrufen.
Die Länge ist 5, also muss erst das C am Ende gestrichen werden: GTAG, sodass dann G,A unt T,G verglichen werden. Du willst für das erste Zeichen G,A,C vergleichen, was zu einem C führt. |
Shizmo |
Kommt exakt der selbe Fehler:
code: |
1:
2:
3:
4:
|
>> Expected result <<
CGATGCGGAT TGAGCTAAGG TGCCACTGAC
>> Your result <<
CGAGCCGGGG TGAGCTAAGG TGCCACTGAC |
|
//: Aber j wird ja immer um einen Teiler von n erhöht, dass heißt erst zählt es die:
Zitat: |
CGATGCGGATTGAGCTAAGG |
dann die:
Zitat: |
CGATGCGGATTGAGCTAAGG |
usw.
Also es zählt alle Zeichen an der "ersten" Stelle, dann an der zweiten, etc.
Also sollte es so schon passen oder? |
eulerscheZahl |
Weil du weitere Zeichen mitzählst, die du abschneiden sollst.
Versuche mal j < dna.length()/n*n |
Shizmo |
Hmm warum, es soll ja alle Zeichen "dividen".
Das Problem ist ja:
code: |
1:
2:
3:
4:
|
>> Expected result <<
CGATGCGGAT TGAGCTAAGG TGCCACTGAC
>> Your result <<
CGAGCCGGGG TGAGCTAAGG TGCCACTGAC |
|
Ich würd gern wissen, warum nur der erste String anders ist, bei allen möglichen Beispielen die mir einfallen funktioniert dieses div ja wunderbar...
|
eulerscheZahl |
Deine lange ODER Verkettung könntest du weglassen, wenn du darüber einfach ein <= nimmst. Trotzdem scheint dein ODER richtig.
code: |
1:
2:
|
for (int i = 0; i < dna.length() / n; i++) {
for (int j = i; j < dna.length(); j = j + dna.length() / n) { |
|
Damit geht j bis zum allerletzten Zeichen von dna. Du solltest das Ende aber einfach ignorieren, wenn es nicht aufgeht. |
Shizmo |
Vielen Dank schon mal.
Hab leider doch noch eine Fehlermeldung zum Teil 1 bekommen, allerdings kann ich damit nichts anfangen, vielleicht fällt dir was auf:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
|
> java -classpath '/tmp/autoc-einfprog-0.5.5-33-g6ad7fba-plus/check-62-12-1453052244' -Duser.language=EN -Duser.region=US -Xmx512M Tester
Wrong result(s) detected. Please check your calculations and compare them to the test calculations below!
Part 1 not passed!
Exception in thread "test" java.lang.Exception:
Part 1
Calculated the following things:
VectorSet vs_dna = new VectorSet(40);
DNA dna = new DNA("CGATGCGGAT");
vs_dna.add(dna);
String result = vs.toString();
Vector v = vs_dna.average();
[Ausführungsprotokoll gekürzt]
String result = v.toString();
DNA dna = new DNA("TGCCACTGAC");
vs_dna.add(dna);
String result = vs.toString();
Error while calling String result = vs.toString()
>> Expected result <<
CGATGCGGAT TGAGCTAAGG TGCCACTGAC
>> Your result <<
CGAGCCGGGG TGAGCTAAGG TGCCACTGAC
Info: Take care of the right number of blanks! (like in the assignment)
at test.checkValue(test.java:379)
at test.run(Unknown Source) |
|
Hier die DNA:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
|
public class DNA extends Vector {
//Instanzvariablen
private String dna;
//Konstruktor
public DNA(String dna){
this.dna = dna;
}
//add - Verknuepft zwei Strings
public Vector add(Vector v){
this.dna = this.dna + ((DNA)v).dna;
return this;
}
//div - Teilt die Strings durch n
public Vector div(int n){
String newDNA = "";
//1.Schleife baut neue DNA
for(int i = 0; i < dna.length()/n; i++){
int c = 0, g = 0, a = 0, t = 0;
//Teilt die Strings durch n und zaehlt die Basen
for(int j = i; j < dna.length(); j=j+dna.length()/n){
if(dna.charAt(j) == 'C'){ c++;}
else if(dna.charAt(j) == 'G'){ g++; }
else if(dna.charAt(j) == 'A'){ a++; }
else if(dna.charAt(j) == 'T'){ t++; }
}
//Welche Base kommt am haeufigsten vor
if(c>g && c>a && c>t){ newDNA = newDNA+"C"; }
else if(g>c && g>a && g>t){ newDNA = newDNA+"G"; }
else if(a>c && a>g && a>t){ newDNA = newDNA+"A"; }
else if(t>c && t>a && t>g){ newDNA = newDNA+"T"; }
//Wenn Basen gleich haeufig auftreten
else if((c==g && c>a && c>t) || (c==a && c>g && c>t) || (c==t && c>g && c>a) || (c==a && c==g && c>t) ||
(c==a && c==t && c>g) || (c==t && c==g && c>a) || (c==a && c==g && c==t)){ newDNA = newDNA+"C"; }
else if((g==a && g>c && g>t) || (g==t && g>c && g>a) || (g==a && g==t && g>c) ) { newDNA = newDNA+"G"; }
else if(a==t && a>g && a>c) { newDNA = newDNA+"A"; }
}
this.dna = newDNA;
return this;
}
//distance - Zaehlt die Hammingdistanz
public double distance (Vector v){
int hd = 0;
//Falls die Strings unterschiedlich lang sind.
if(this.dna.length() != ((DNA)v).dna.length()){
return -1;
}
//Zaehler
for(int i = 0; i < this.dna.length(); i++){
if(this.dna.charAt(i) != ((DNA)v).dna.charAt(i)){
hd++;
}
}
return hd;
}
//toString
public String toString(){
return dna;
}
} |
|
Und hier die VectorSet:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
|
public class VectorSet {
//Instanzvariablen
int size;
Vector[] set;
//Konstruktor
public VectorSet (int size){
this.size = size;
set = new Vector[size];
}
//add - Fuegt die Vectoren nacheinander in ein Array
public void add (Vector v){
for(int i = 0; i < size; i++){
if(set[i] == null){
set[i] = v;
break;
}
}
}
//average - add und div Methode vom jeweiligen Vector
public Vector average(){
Vector v = new Vector();
int realSize = 0;
for(int i = 0; i < set.length; i++){
if(set[i] != null){
v = v.add(set[i]);
realSize++;
}
else{
break;
}
}
return v.div(realSize);
}
public VectorSet cluster(int n){
return this;
}
//toString
public String toString(){
String output = "";
for(int i = 0; i < set.length; i++){
if(set[i] == null){
break;
}
else{
output = output+set[i].toString()+" ";
}
}
return output;
}
} |
|
|
eulerscheZahl |
Ich sortiere mal ints. Wenn du Vector2D nimmst, ändert sich die Abstandsberechnung natürlich.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
|
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] c = new int[x.length];
boolean[] used = new boolean[c.length];
c[0] = x[0];
used[0] = true;
for (int i = 1; i < c.length; i++) { //finde Wert für c[i]
//initialisieren: Referenzwert als bisheriges Optimum berechnen
int bestIndex = 1;
while (used[bestIndex])
bestIndex++; //finde ersten ungenutzten Wert
int bestDist = 0;
for (int j = 0; j < i; j++) {
bestDist += Math.abs(x[i] - c[j]); //hier musst du eine Wurzel ziehen
}
//andere Werte prüfen
for (int k = bestIndex + 1; k < c.length; k++) {
if (used[k])
continue; //schon benutzt, scheidet also aus.
int currentDist = 0;
for (int j = 0; j < i; j++) {
currentDist += Math.abs(x[k] - c[j]);
}
if (currentDist > bestDist) {
bestDist = currentDist;
bestIndex = k;
}
}
used[bestIndex] = true;
c[i] = x[bestIndex];
}
System.out.println(Arrays.toString(c));
}
} |
|
|
Shizmo |
1 hab ich, ja.
Ich weiß nicht mal wie ich anfangen sollte, Pseudocode würde mir auch schon viel helfen. |
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen. |
|
|