Hashtable probleme

Status
Nicht offen für weitere Antworten.

sim26

Aktives Mitglied
Hallo alle,

ich bin ein Biologe Doktorand, soll ich ein paar Programme mit Java schreiben.
Bis jetzt hat geklappt aber mit 1000 Schwierigkeiten aber irgendwie macht schon spaß ;-)

Also ich muss jetzt ein Programme schreiben die so macht

-->Ich habe ein Sequence z.b.

ACGCTCGCTGATATAT


Wenn ich die Nr. „x“ z.b. zu meine Programme gebe dann soll schreiben die ersten x Buchstaben und er merkt das das ist nur ein mal gibt "1" dann er schreibt in den nächsten Linie noch mal die x aber minus die erste Buchstabe von dem ersten x plus ein neue Buchstabe und er vergleicht das mit dem ersten wenn das ist das gleiche dann wir haben 2 wenn nicht dann ein 1 und soweiter.


D.h.
Sequence: ACGCTCGCTGATATAT

X =3

Erwartete Ergebnisse sind:

ACG 1
CGC 1
GCT 1
CTC 1
TCG 1
CGC 2
......
……....
...


Habe schon was geschrieben und hat geklappt, aber das Programm schreibt zu mir nicht die ganz Sequence ACA z.b aber er schreibt und zählt die Buchstaben getrennt und nicht zusammen  ich bin seit 3 tage damit beschäftigt aber habe nix gefunden, könnte ihr mich helfen bitte?






Code:
package com.javatutor.insel.ui.layout;
import java.awt.*;
import java.text.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.util.Map;
import java.util.HashMap;
import java.io.*;

class Counter {
  int r = 1;

  public String toString() {
      return Integer.toString(r);
  }
}

public class FirstSample
{
    String Sequence;
  public static void main( String[] args )
  {
   
      
JFrame f=new JFrame("My Application");
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setLayout( new GridLayout(10, 2, 2, 2) );
    
    f.add( new JLabel("                    yoursequence (Label)     ") );

    
    final JTextField tf = new JTextField(20 );
     f.add( tf );
    //f.add( new JLabel(" "), BorderLayout.LINE_START);
    
    f.add( new JLabel("                Seq auswählen: "), BorderLayout.LINE_START);
    
    
   JTextField bd= new JTextField(20 );
       f.add(bd);
                f.add( new JLabel("                   Ergebnisse (Label)     ") );
 
                            final JLabel sb = new JLabel("Ergebnisse");
                             f.add(sb);
                            sb.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
                                     f.add( new JLabel("                      ") );
                                     f.add( new JLabel("                        ") );
                                     f.add( new JLabel("                       ") );
                                     f.add( new JLabel("                        ") );
                     JButton b= new JButton("Start");
                    f.add(b);
                    ActionListener a1= new ActionListener() {
                     public void actionPerformed( ActionEvent e ) {
                    int nan = (int)((Double.parseDouble(tf.getText()))); 
                             
      int k=nan;
      int m=0;
      int j;
      String Sequence="GAATTGATAGGGA";
     Hashtable hm = new Hashtable();
      for(int i=0;i<Sequence.length();i++){ 
          for ( j=m ;j<nan;j++){
              
               if (hm.containsKey(Sequence.charAt(j)))
           
        
 ((Counter) hm.get(Sequence.charAt(j))).r++;       
          else      
        hm.put(Sequence.charAt(j), new Counter());     
          }
          nan=nan+1;
        m=m+1;
          if (m==Sequence.length()-k+1){
          break;
          }
        
         System.out.println(hm);   
         
         
    
          
     
                    sb.setText(nan + "" );
                            }
                     }
                         };
                     b.addActionListener(a1);
     
     
                                                             JButton c= new JButton("Quit");
                                                             f.add(c);
                                                            ActionListener a3=new ActionListener(){
                                                                public void actionPerformed(ActionEvent e){
                                                                    System.exit(0);
                                                                }
                                                            };
                                                            c.addActionListener(a3);
    
  
    
  
    
    
    f.pack();
    f.setVisible( true );
  }
}


Vielen Danke
 
das Klassendesign ist nicht so prickelnd ;-)

Die Klasse Counter ist im Grunde unnötig. Wichtig ist deine for schleife in Abhängigkeit von X laufen zu lassen und dann nicht einen, sondern X Buchstaben zu zählen

Code:
for(int i = 0; i < sequences.length; i += x) {
  String subsequence = sequences.substring(i, i+x); // hier noch testen, ob man nicht über die Länge des String rauskommt

  if(map.containsKey(subsequence)) {
    // wert um eins erhöhen - einfache Integer reicht, man braucht keine neue Klasse
  }
  else {
    map.put(subsequence, Integer.valueOf(1));
 }
}

hast du dir schonmal BioJava angeschaut ? vor ein paar Jahren war es noch nicht der Brüller, vll hat sich mittlerweilen schon was geändert 🙂
 
vielen danke erstes Mal deathbyaclown, das finde ich so wunderbar dass Sie mich geantwortet haben (bin voll Happy).

Ich probiere mal, dann sage ich bescheid ob geklappt hat!

--------------------

Das Klassendesign ist unpraktisch und sieht für Jemand erste angefangen die Maus zu bewegen. Ich weiß das, aber ich will mich verbessern und auch den Java richtig lernen.
Ich bemühe mich schon. 🙂
 
Hallo deathbyaclown,

also ich habe probiert seit Gestern mit Ihren Vorschlag aber irgendwie bin zu dumm, hat gar nicht funktioniert bei mir. Er gibt mir was ich nicht brauche und noch dazu mein Chef hat gemeint das ist besser wenn ich dass mache durch Mehrdimensionale Arrays und nicht mit Hashtable, (weil sowieso wir werden nur mit 4 Buchstaben arbeiten ACTG von DNA) .
Von Array Geschichte habe ehrlich gesagt auch nicht viel Ahnung bin gerade dabei das alles zu verstehen aber ich habe den Gefühle das werde ich nicht schaffen!!!!!!!!
😳 😳
 
dann sollte dein chef (btw hier im board ist es so üblich *g) genauer erklären wie er das mit einem mehrdimensionalen Array meint... Bei einem array benötigst du einen index um auf einen eintrag zu zugreifen, z.b. array[1] und so.
Da du aber hier mit Strings arbeitest... wenn du nur einzelne Aminosäuren zählst, so kannst du natürlich ein Array nehmen, wobei du halt dann die indizes 0-3 (für ACTG), sobald du aber Sequenzen von Aminosäuren nimmst ufert das aus.
Daher find ich intuitiv den mehrdim. Array unsinnig
 
> ich habe probiert seit Gestern mit Ihren Vorschlag aber irgendwie bin zu dumm, hat gar nicht funktioniert bei mir

mit solchen Aussagen kommt man nicht weit, WAS hat nicht funktioniert?
Exception?, Beispiel und wie war da die Ausgabe/ welche wurde stattdessen erwartet?

Tipp: gar nicht erst mit GUI und Eingabefeldern usw. aufhalten, dass dauert viel zu lange zum testen,
in einem Konsolen-Programm den Algorithmus testen und später dann in die GUI einbauen

ein Beispiel in dem man auch sieht wie der Vorschlag von deathbyaclown funktioniert:
(ein Fehler war da aber tatsächlich drin, es wurde immer x Felder weitergesprungen statt nur einem)

Code:
public class Test {

	public static void main(String[] args) throws Exception {
		String s = "ACTAAAACT";
		int x = 3;

		Hashtable map = new Hashtable();
		for (int i = 0; i < s.length()-x+1; i++) {

			String sub = s.substring(i, i + x);
			Integer anz = (Integer) map.get(sub);

			if (anz == null) {
				anz = new Integer(1); // mit 1 anfangen
			} else {
				anz = new Integer(anz.intValue()+1);  // erhöhen
			}
			// später kann man mal das ständige Erzeugen der Integer-Objekte durch etwas
			// performanteres ersetzen

			System.out.println(sub+"  "+anz);
			map.put(sub,anz);
		}
	}

}

----------------------------------

die Array-Variante ist auch interessant,
ist ja eigentlich deine Aufgabe, da will ich mal nicht zu viel verraten,

aber starte doch bei x = 1, wie viele verschiedene Kombinationen gibts dann?
wie siehts bei x = 2, x = 3 aus?
so viele sind das gar nicht, da reicht dann ein Array,

du musst dir nur überlegen wie du von einem Buchstaben auf den Index im Array kommst,
z.B. von A auf 0, um auf das 0.te Feld im Array zugreifen zu können

im Zweifel schreibst du dir eine simple Operation
Code:
int getIndex(char x) {
  if (x == 'A') {
    return 0;
  } else {
    ..
  }
}
in dem Array steht dann die bisherige Anzahl der Kombination
 
na super - dann hat man wieder ne Art Mapping und warum den extra aufwand wenn man das mit einer map simpel lösen kann ?

ps: stimmt ich bin die Triplets durchgegangen und nicht eine 3er Kombination von jeder nachfolgenden position
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben