2 Stimmen

Wie kann ich eine Liste einer benutzerdefinierten Klasse mit zwei Feldern erstellen und eine Ausgabe erhalten?

Ich muss eine Liste einer Gensequenz in Java erstellen und die Startpositionen der Teile, die mich interessieren. Ich verwende eine .txt-Datei als Eingabe und suche dann nach "GT" in der Sequenz. Sobald ich sie gefunden habe, möchte ich sie in einem Array mit dem entsprechenden Index speichern. Ich habe es nicht hinbekommen. Bitte helfen Sie mir.

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

class Signal{
    public String signal;
    public int  pos;
    public Signal(String s, int p) {
        s = signal;
        p = pos;

    }

public static String inputSequence(String filename) throws IOException{

        FileInputStream stream = new FileInputStream(new File(filename));

        try {
            FileChannel fc = stream.getChannel();
            MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

    return Charset.defaultCharset().decode(bb).toString();

}
        finally{
            stream.close();
        }
    }
    public static void main(String[] args) {

     String c1 = "GT";
     String seq = null;
         List<Signal> s2 = new ArrayList<Signal>();
         String s1;
         int i;

         try {
            seq = inputSequence(path);
         } catch (IOException ex) {
            Logger.getLogger(Signal.class.getName()).log(Level.SEVERE, null, ex);
         }
         for (i = 0; i < seq.length() - 2; i++ ) {
     s1 = seq.substring(i,i+2);
        if (s1.equals(c1)){

            Signal ss = new Signal(s1, i);
            s2.add(ss);

}

    }
         System.out.print(s2);

    }
}

2voto

AnshulGarg Punkte 89

Ihr Konstruktor sollte folgendermaßen aussehen:

public Signal(String s, int p) {
    signal = s;
    pos = p;
}

Danach sollte es gut funktionieren.

1voto

dogbane Punkte 253146

Sie können verwenden indexOf in einer Schleife, um alle Vorkommen von "GT" zu finden. Dies ist unten dargestellt:

 String c1 = "GT";
 String seq = null;
 List<Signal> s2 = new ArrayList<Signal>();

 try {
    seq = inputSequence(path);
 } catch (IOException ex) {
    Logger.getLogger(Signal.class.getName()).log(Level.SEVERE, null, ex);
 }

 int index = seq.indexOf(c1, 0);
 do{
      if(index != -1){
          Signal ss = new Signal(c1, index);
          s2.add(ss);
          System.out.println(index);
      }
      index = seq.indexOf(c1, index+2);
 }while(index != -1);

 System.out.println(s2);

Um die Signalliste auszudrucken, müssen Sie die Funktion toString in Ihrem Signal Klasse:

@Override
public String toString(){
    return "(" + signal + "," + pos + ")";
}

0voto

Feliks_WR Punkte 1

Vielleicht versuchen Sie, nicht ArrayList zu verwenden.

Sie können versuchen, Ihre eigene Klasse zu bilden:

 public class ArraySignals {
      public ArraySignals(Signal ...signals){ s = signals...; } // assigns to array
      private Signal[] s = new Signal[];    // uninitialized
      // ... ...
      @Override public String toString() {     String str = "["
        for (Signal sig : s) {    // for-each loop / range-base for loop
          str += sig.toString() + ", ";
        }
      }
    }

Da man in Java keine Templates spezialisieren kann (da es keine gibt; es gibt nur Generics), ist dies eine geeignete Option.

Wenn Sie (noch) nicht wissen, was Generika sind, machen Sie sich keine Sorgen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X