# Value einer Hashtable nach deren grüße sortieren



## sim26 (17. März 2006)

Hallo zusammen 

Ich möchte die Value einer Hashtable nach deren grüße sortieren, dann die ersten  100 value die   höch zahl haben  allein in einem anderen hashtable machen. Hat da jemand eine zündende Idee? 
I arbeite mit einem String die ungefähr mir 4 000 000 Buchstaben ist.

Weiß ich auch nicht ob gibt’s vielleicht andere Methode außer hash wenn die zahl so hoch ist.

Die Programme ist folgendes 



public class Test { 

   public static void main(String[] args) throws Exception { 
      String s = "dfghtzhb…………………"; 
      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 
         } 
         System.out.println(sub+"  "+anz); 
         map.put(sub,anz); 
      } 
   } 

}


----------



## RealHAZZARD (17. März 2006)

Ich weiß nicht ganz was du machen willst.
Kannst du das etwas näher und DEUTLICHER und DEUTSCHER erklären?
Ansonsten würde ich mal sagen:
Nimm doch einen Array.
Bei einen String-Array hat jedes Element die Eigenchaften eines Strings.
Also auch String.length.
Dann musst du das nur noch in dein Sortierverfahren einbauen.


----------



## sim26 (17. März 2006)

die programme macht folgendes:

-->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
......
……....
...

jetzt  Ich möchte die Value meiner Hashtable erstens nach deren grüße sortieren, dann die ersten 100 value die höch zahl haben allein in einem anderen hashtable machen um weiter mit die arbeiten zu können.

höffentlich ist das jetzt klar genug


----------



## dadom110 (17. März 2006)

sim26 hat gesagt.:
			
		

> die programme *machen* folgendes:
> 
> -->Ich habe *eine* Sequence z.b.
> 
> ...



Hier hört meine Geduld leider auf, es tut mir wirklich Leid, ich bin normalerweise kein Mensch der auf Rechtschreibung und Grammatik pocht, weil auch mir des öfteren genug Fehler unterkommen, aber so penetrant alles falsch zu schreiben, kann nicht wirklich dein Ernst sein...wenn das nen Scherz sein soll, hoffe ich nicht das du auf deine Inhatliche Frage (wo hast sie versteckt?) eine qualifizierte Antwort erwartest.

Mfg
Dom


----------



## RealHAZZARD (17. März 2006)

Dann nimm einen 2dimensionalen Array, dessen Inhalt dann vielleicht so aussieht:
{
{ACG,1},
{CGC, 1},
{TCG, 1},
...
}
Wie man mit Arrays im Allgemeinen umgeht steht da:
http://www.galileocomputing.de/openbook/javainsel5/javainsel03_007.htm#Xxx999378


----------



## sim26 (17. März 2006)

Sorry dass ich das nicht gut und besser erklären kann,  dieses Mal versuch ich mehr deutlicher,

Ich habe :

String sequence = " ACGCTCGCTGATATAT // ich habe eine Seqeunce von Buchstaben

int x = 3; //dann eine variable x, hier Z.B : x=3

dann werde alles in einem Hashtable  gemacht. 

Als clue : Buchstaben jedes mal x zahl werde genommen

Als Value :wie oft wiederholt sich den Value überhaupt in dem Ergebnisse.


er nimmt die ersten X Buchstaben, d.h.  hier : ACG (clue). Und als value kriegt er 1 weil bis jetzt nur einmal 
gibt ACG in dem Table

dann nächste schritt nehmt er : CG + nächste Buchstabe, d.h. CGC . hier auch value kriegt ein 1. 

Bis Z.B. CGC er merkt das es gab schon mal CGC. D.h.  value erde dann 2 neben CGC.

ACGCTCGCTGATACGCTCGAT………..
ACG 1
CGC 1
GCT 1
CTC 1
TCG 1
CGC 2
GCT 2
CTG  1
TGA 1
GAT 1
ATA 1
TAC 1
ACG 1
CGC 3
……..

Das habe ich dann schon gemacht,

jetzt Ich möchte die Value einer Hashtable nach deren grüße sortieren, dann die ersten 100 value die höch zahle haben allein in einem anderen hashtable machen.


----------



## kroesi (17. März 2006)

Hi !

Also ich muss mal meinen Senf hier loslassen. Ich finde es wichtig, daß man auf Grammatik achtet. Zudem bin ich der Meinung, daß jeder, der Ausländer in einem Land ist, die Sprache dieses Landes lernen sollte. 

Andereseits bin ich auch der Meinung, daß man solche Leute dabei auch unterstützen sollte, anstatt direkt auf ihnen rum zu hacken ! Ich gebe zu, daß es schwierig ist, daß Problem von "sim" nachzuvollziehen, aber dann sollte man gerade helfen, sonst passiert nämlich genau das, worüber ihr euch hier aufregt. Wenn ich zum Beispiel ein Russe wäre, der nun hier lebt und versucht die deutsche Sprache zu lernen und schreibe in ein deutsches Forum in gebrochenem Deutsch und werde dann direkt angemacht, würde ich es morgen wieder in einem russichem Forum versuchen (und verliere veilleicht auch ein kleines bisschen die Lust am Deutsch- lernen). 

Ich denke, ich verstehe auch eure Standpunkte ein wenig, aber gleich so auf die Tour : "Meine Geduld ist am Ende ..." finde ich echt nicht nett. Auch wir sind ein wenig mitverantwortlich an gewissen Dingen  ... 

Ich möchte hier keinem zu nahe treten, aber das musste mal raus.

Nix für Ungut und schönes Wochenende,

Krösi


----------



## RealHAZZARD (18. März 2006)

Sorry. Ich steh immernoch auf dem Schlauch.
Das Beste ist, du schickst mal deinen Code.
Und dann kommentier mal im Code, wo du das Problem hast.
_PS: Mit dem "gesamten" Code geht sowas immer leichter zu 
beantworten_ (*Tipp!*)


----------



## schnuffie (20. März 2006)

Sowie ich Dich verstehe, suchst Du die Häufigkeit immerwieder vorkommender Wortgruppen, deren Länge Du mit int x vorgibst, das habe ich zumindest verstanden.


```
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Haeufigkeit {
  public static void main(String[] args) {
    Integer temp;
    String s = "ACGCTCGCTGATATAT";
    int x = 3;
    Map map = new HashMap();
    for (int i = 0; i < (s.length() - x); i++) {
      temp = (Integer)map.get(s.substring(i, i + x));
      if (temp == null) {
        map.put(s.substring(i, i + x), new Integer(1));
      } else {
        map.put(s.substring(i, i + x), new Integer(temp.intValue() + 1));
      }
    }
    Object key;
    for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {
      key = it.next();
      System.out.print(key);
      System.out.print("=");
      System.out.println(map.get(key));
    }
  }
}
```
 
In Deiner Map stehen nun alle Wortgruppen als Key und deren Häufigkeit als Value:


```
TAT=1
ACG=1
ATA=2
CGC=2
CTC=1
GAT=1
CTG=1
TCG=1
TGA=1
GCT=2
```


----------



## sim26 (21. März 2006)

Hallo zusammen nochmal:

Das ist dann mein Code:

import java.io.*;
import java.util.*;
import java.awt.*;
public class test {
public static void main(String[] args)throws IOException  {
            load();           
                }  
    public static void load(){
        int nan = 3;                  
        String seqe="ACGTAGATAGATCAGAT";
        try {   
          System.out.println(seqe.length());
          Hashtable map=new Hashtable();
                    for(int i=0;i<seqe.length()-nan+1;i++){

                         String seq = seqe.substring(i,i+nan);
                        Integer zahl=(Integer) map.get(seq);
                            if (zahl==null){
                                    zahl=new Integer(1);
                                     }//if
                                else{
                                    zahl=new Integer(zahl.intValue()+1);
                                    }//else

                      System.out.println(seq+"    "+zahl); 
                       map.put(seq,zahl); 
                 }//for i
       }//try
               catch(Exception r) {
                    r.printStackTrace();
                    }       
    }                              
     }      

    Er gibt das Ergebnis:

ACG    1
CGT    1
GTA    1
TAG    1
AGA    1
GAT    1 ATA    1
TAG    2
AGA    2
GAT    2
ATC    1
TCA    1
CAG    1
AGA    3
GAT    3 
Was ich will jetzt machen sollte so aussehen:

AGA    3
GAT    3
TAG    2
AGA    2
GAT    2  ACG    1
CGT    1
GTA    1
TAG    1
AGA    1
GAT    1 ATA    1
ATC    1
TCA    1
CAG    1



Ich hoffe jetzt ist klar genug,  Sorry noch mal wegen meinem deutsch, bin erste seit einem Jahr hier in Deutschland........


----------



## sim26 (21. März 2006)

Sorry habe was falsch geschrieben

Das ist dann mein Code:

import java.io.*;
import java.util.*;
import java.awt.*;
public class test {
public static void main(String[] args)throws IOException {
load();
}
public static void load(){
int nan = 3;
String seqe="ACGTAGATAGATCAGAT";
try {
System.out.println(seqe.length());
Hashtable map=new Hashtable();
for(int i=0;i<seqe.length()-nan+1;i++){

String seq = seqe.substring(i,i+nan);
Integer zahl=(Integer) map.get(seq);
if (zahl==null){
zahl=new Integer(1);
}//if
else{
zahl=new Integer(zahl.intValue()+1);
}//else

System.out.println(seq+" "+zahl);
map.put(seq,zahl);
}//for i
}//try
catch(Exception r) {
r.printStackTrace();
}
}
}

Er gibt das Ergebnis:

ACG 1
CGT 1
GTA 1
TAG 1
AGA 1
GAT 1 
ATA 1
TAG 2
AGA 2
GAT 2
ATC 1
TCA 1
CAG 1
AGA 3
GAT 3

Was ich will jetzt machen sollte so aussehen:

AGA 3
GAT 3
TAG 2
AGA 2
GAT 2 
ACG 1
CGT 1
GTA 1
TAG 1
AGA 1
GAT 1 
ATA 1
ATC 1
TCA 1
CAG 1



Ich hoffe jetzt ist klar genug, Sorry noch mal wegen meinem deutsch, bin erste seit einem Jahr hier in Deutschland........


----------



## RealHAZZARD (21. März 2006)

Vielleicht solltest du dir dazu noch eine neue HashTable erzeugen.
Die Alte kannst du dann durchlaufen, das höchste Element finden,
in die neue HashTable schreiben und in der alten löschen.


----------



## schnuffie (21. März 2006)

Entweder Du sortierst "per Schleife" selbst, oder nutzt der Einfachheit halber ein TreeSet:


```
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
public class Haeufigkeit {
  
  private static final String SPLIT = " ";
  public static void main(String[] args) {
    Integer temp;
    String s = "ACGCTCGCTGATATAT";
    int x = 3;
    Map map = new HashMap();
    for (int i = 0; i < (s.length() - x); i++) {
      temp = (Integer)map.get(s.substring(i, i + x));
      if (temp == null) {
        map.put(s.substring(i, i + x), new Integer(1));
      } else {
        map.put(s.substring(i, i + x), new Integer(temp.intValue() + 1));
      }
    }
    Object key;
    Set set = new TreeSet(new Haeufigkeit().new MyComperator());
    for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {
      key = it.next();
      set.add(key + Haeufigkeit.SPLIT + map.get(key));
    }
    for (Iterator it = set.iterator(); it.hasNext(); ) {
      key = it.next();
      System.out.println(key);
    }
  }
  
  // Vergleicher
  private class MyComperator implements Comparator {
    
    public int compare(Object o1, Object o2) {
      String[] s1 = ((String)o1).split(Haeufigkeit.SPLIT);
      String[] s2 = ((String)o2).split(Haeufigkeit.SPLIT);
      return this.compare(s1[0], s1[1], s2[0], s2[1]);
    }
    
    private int compare(String s11, String s12, String s21, String s22) {
      if (s12.equals(s22)) {
        return s11.compareTo(s21); // alphanumerischer Vergleich der Wortgruppen bei gleicher Häufigkeit
      } else {
        return s22.compareTo(s12); // alphanumerischer Vergleich der Häufigkeit (absteigend)
      }
    }
    
  }
}
```
 
Die Ausgabe ist dann:


```
ATA 2
CGC 2
GCT 2
ACG 1
CTC 1
CTG 1
GAT 1
TAT 1
TCG 1
TGA 1
```


----------



## RealHAZZARD (21. März 2006)

Nicht schlecht. 
das mit dem Treeset macht Sinn.
Wieder mal was gelernt.


----------



## Thomas Darimont (21. März 2006)

Hallo!

ich haette das ungefaehr so gemacht:

```
/**
 * 
 */
package de.tutorials;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author Tom
 * 
 */
public class DNAAnalysisExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        String sequence = "ACGTAGATAGATCAGAT";

        System.out.println(new DNASequenceAnalyzer()
                .analyze(new BufferedReader(new StringReader(sequence))));

//        FileReader fileReader = new FileReader(new File("c:/dnaSequence.txt"));
//
//        System.out.println(new DNASequenceAnalyzer()
//                .analyze(new BufferedReader(fileReader)));
    }

    static class DNASequenceAnalyzer {
        Set<DNAPattern> analyze(BufferedReader sequenceReader) {
            Map<String, DNAPattern> results = new HashMap<String, DNAPattern>();
            DNASequenceIterator dnaSequenceIterator = new DNASequenceIterator(
                    sequenceReader, 3);
            while (dnaSequenceIterator.hasNext()) {
                String dnaSequenceKey = (String) dnaSequenceIterator.next();
                if (results.containsKey(dnaSequenceKey)) {
                    results.get(dnaSequenceKey).count++;
                } else {
                    results.put(dnaSequenceKey, new DNAPattern(dnaSequenceKey));
                }
            }
            return new TreeSet<DNAPattern>(results.values());
        }

        static class DNASequenceIterator implements Iterator {
            BufferedReader sequenceReader;

            StringBuilder nextSubSequence;

            char latestChar;

            boolean start;

            public DNASequenceIterator(BufferedReader sequenceReader,
                    int itemGauge) {
                this.sequenceReader = sequenceReader;
                this.nextSubSequence = new StringBuilder();
                char[] initialSubSequence = new char[itemGauge];
                try {
                    this.sequenceReader.read(initialSubSequence);
                    nextSubSequence.append(initialSubSequence);
                    start = true;
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            public boolean hasNext() {
                if (start) {
                    return true;
                } else {

                    int value;

                    try {
                        value = sequenceReader.read();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }

                    if (value == -1) {
                        return false;
                    } else {
                        latestChar = (char) value;
                        return true;
                    }
                }
            }

            public Object next() {
                if (!start) {
                    nextSubSequence.deleteCharAt(0);
                    nextSubSequence.append(latestChar);
                } else {
                    start = false;
                }
                return nextSubSequence.toString();
            }

            public void remove() {
                throw new UnsupportedOperationException();
            }
        }

        /**
         * @author Tom
         * 
         */
        static class DNAPattern implements Comparable {
            String dnaPattern;

            int count;

            public DNAPattern(String dnaPattern) {
                this.dnaPattern = dnaPattern;
                this.count = 1;
            }

            public int hashCode() {
                return dnaPattern.hashCode();
            }

            public boolean equals(Object obj) {
                return dnaPattern.equals(obj);
            }

            public String toString() {
                return dnaPattern + ": " + count;
            }

            public int compareTo(Object o) {
                if (o instanceof DNAPattern) {
                    return this.count < ((DNAPattern) o).count ? 1 : -1;
                }
                return 0;
            }
        }
    }
}
```

So koennen auch etwas groessere Sequenzen als ein Zeichenstrom gesehen und analysiert werden.

Ausgabe:
[AGA: 3, GAT: 3, TAG: 2, ACG: 1, ATA: 1, ATC: 1, CGT: 1, GTA: 1, TCA: 1, CAG: 1]

Gruss Tom


----------



## RealHAZZARD (21. März 2006)

Wie kriegt man den Quelltext so schön bunt?


----------



## Thomas Darimont (21. März 2006)

Hallo!

Schau mal hier:
http://www.tutorials.de/forum/interne-news/235108-tagebuch-zur-tutorials-de-v-6-entwicklung.html

Gruss Tom


----------



## RealHAZZARD (21. März 2006)

Ah...ok...Danke


----------

