Реализация связанного с Java списка не будет добавлять данные - PullRequest
0 голосов
/ 22 февраля 2019

Я создал свой собственный связанный список в Java (код ниже), и я пытался сохранить последовательности ДНК? РНК из текстового файла в массиве пользовательского типа данных, который содержит ДНК / РНК перечисления, а также связанный ДНКсписок, содержащий фактическую последовательность ДНК.Я не знаю, если символы просто не вставляются в связанный список или есть проблема с моим toString, но вывод выводит только позицию и тип перечисления, а не последовательность из списка.Код ниже Мой класс узла

public class Node<E> {
    private Node<E> next;
    protected E data;

    Node(E data,Node<E> nextVal){
        this.data=data;
        next=nextVal;
    }
    Node(Node<E> nextVal){
        next=nextVal;
    }

    Node<E> Next(){
        return next;
    }
    Node<E>setNext(Node<E> nextVal){
        return next=nextVal;
    }
    E data(){
        return data;
    }
    E setData(E it){
        return data=it;
    }
}

Мой класс связанного списка

    public class MyLinkedList<E> implements List<E>{
    private Node<E> head;
    private Node<E> tail;
    protected Node<E> curr;
    private int size;
    MyLinkedList(int size){
        this();
    }
    MyLinkedList(){
        curr=tail=head=new Node<E>(null);
        size=0;
    }
      @Override
      public void clear() {
        head.setNext(null);
        curr=tail=head=new Node<E>(null);
        size=0;
      }

      @Override
      public void insert(E item) {
        curr.setNext(new Node<E>(item, curr.Next()));
        if(tail==curr)
            tail=curr.Next();
        size++;

      }
      @Override
      public void append(E item) {
        tail=tail.setNext(new Node<E>(item, null));
        size++;
      }

      @Override
      public E remove() {
        if(curr.Next() ==null)
          return null;
        E item=curr.Next().data();
        if(tail==curr.Next())
            tail=curr;
        curr.setNext(curr.Next().Next());
        size--;
        return item;
    }

      @Override
      public void moveToStart() {
        curr =head;
      }

      @Override
      public void moveToEnd() {
        curr=tail;
      }

      @Override
      public void prev() {
        if(curr==head)
            return;
        Node<E> temp=head;
        while (temp.Next()!=curr)
            temp=temp.Next();
        curr=temp;

      }

      @Override
      public void next() {
        if(curr!=tail)
            curr=curr.Next();
      }

      @Override
      public int length() {
          return size;
      }

      @Override
      public int currPos() {
          Node<E>temp=head;
          int i;
          for(i=0;curr!=temp;i++)
              temp.Next();
          return i;

      }

      @Override
      public void moveToPos(int pos) {
        assert (pos>=0)&& (pos<=size):
          "Position out of Range";
        curr=head;
        for(int i=0;i<pos;i++)
            curr.Next();

      }

      @Override
      public E getValue() {
          if(curr.Next()==null)
              return null;
          return curr.Next().data();
      }

      @Override
     public String toString() {
          String result = "";
          Node current = head;
          while(current.Next() != null){
              result += current.data();
              if(current.Next() != null){
                  result += ", ";
              }
              current = current.Next();
          }
          return "" + result;
      }
}

Это класс SequenceArr, который обрабатывает операции над массивом, упомянутым выше (здесь не завершено, но все, чтоиспользуется в этом примере)

 public class SequenceArr {
 private TypeSeq [] SeqArr;
 private int size=0;
 private int MAXSIZE;

 public SequenceArr(int MAXSIZE){
     this.MAXSIZE=MAXSIZE;
     SeqArr =new TypeSeq[MAXSIZE];
     size=0;
 }
 public void insert(int pos, Type t, MyLinkedList<Character> seq){
     TypeSeq currentEl=new TypeSeq(t,seq);
     assert pos<=MAXSIZE: "Position over maximum size of array";
     SeqArr[size]=currentEl;
     size++;
    }
 public void remove(int pos){
     if(SeqArr[pos]!=null){
         while(SeqArr[pos+1]!=null){
             SeqArr[pos]=SeqArr[pos+1];
         }
         if(SeqArr[pos+1]==null){
             SeqArr[pos]=null;
         }
      }
     else
         System.out.print("No sequence to remove at specified position");
    }
 public void print(){
     int i=0;
     while (SeqArr[i]!=null){
         System.out.println(i+"\t"+SeqArr[i].getType()+"\t"+SeqArr[i].getBioSeq().toString());
         i++;
     }
    }
 public void print(int pos){
        if(SeqArr[pos]==null)
            System.out.print("No sequence to print at specified position");
        else
            System.out.println(SeqArr[pos].getType()+"\t"+SeqArr[pos].getBioSeq().toString());
    }

Пользовательский тип данных, который я создал, состоит из

public class TypeSeq {
    private Type type;
    private MyLinkedList<Character> BioSeq;
    public TypeSeq(Type type, MyLinkedList<Character> BioSeq){
        this.type=type;
        this.BioSeq=BioSeq;
    }

    public MyLinkedList<Character> getBioSeq() {
        return BioSeq;
    }

    public void setBioSeq(MyLinkedList<Character> bioSeq) {
        BioSeq = bioSeq;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }
}

и моего класса DNAList, который обрабатывает ввод и содержит метод main

    import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class DNAList {
    static SequenceArr seqar;
    public static void main(String []args){
        MyLinkedList<String> hey=new MyLinkedList<>();
        hey.append("Hello");

        int arraysize= Integer.parseInt(args[0]);
        String filePath=args[1];
        File file=new File(filePath);
        seqar=new SequenceArr(arraysize);
        exefromFile(file);

    }

    public static void exefromFile(File file){
        Scanner sc;
        try{
            sc=new Scanner(file);
            while(sc.hasNextLine()){
                String cmd=sc.nextLine();
                if(!cmd.equals(""))
                    execute(cmd);
            }


        }catch (FileNotFoundException e){
            e.printStackTrace();

        }
    }

    public static void execute(String s){
        s=s.trim();
        String [] commands=s.split("\\s+");
        switch (commands[0])
        {
            case "insert":
                int pos=Integer.parseInt(commands[1]);
                Type t=Type.fromString(commands[2]);
                char [] charArr=commands[3].toCharArray();
                MyLinkedList<Character> seq=new MyLinkedList<>(charArr.length);
                char curChar;
                for(int i=0;i<seq.length();i++){
                    curChar=charArr[i];
                    if(t==Type.DNA&&(curChar=='A'||curChar=='C'||curChar=='G'||curChar=='T'))
                        seq.append(charArr[i]);
                    else
                        System.out.print("Error occurred while inserting");
                }
                seqar.insert(pos,t,seq);
                break;
            case "remove":
                pos=Integer.parseInt(commands[1]);
                seqar.remove(pos);
                break;
            case "print":
                if(commands.length>1&&commands[1]!=null){
                    pos=Integer.parseInt(commands[1]);
                    seqar.print(pos);
                }
                else
                    seqar.print();
                break;
            case "clip":
                pos=Integer.parseInt(commands[1]);
                int start =Integer.parseInt(commands[2]);
                int end =Integer.parseInt(commands[3]);
                seqar.clip(pos,start,end);
                break;
            case "copy":
                int pos1=Integer.parseInt(commands[1]);
                int pos2=Integer.parseInt(commands[2]);
                seqar.copy(pos1,pos2);
                break;
            case "transcribe":
                pos=Integer.parseInt(commands[1]);
                seqar.transcribe(pos);
                break;
        }

    }

}

Входной файл .txt будет выглядеть примерно так:

insert 0 DNA AATTCCGGAATTCCGG

print

, но на выходе будет просто

0 ДНК и последовательность не будет напечатана.Есть идеи?

1 Ответ

0 голосов
/ 22 февраля 2019

В коде довольно много ошибок, если упомянуть некоторые:

MyLinkedList(int size){
    this();
}
MyLinkedList(){
    curr=tail=head=new Node<E>(null);
    size=0;
}

это всегда инициализирует ваш список размером 0.

char [] charArr=commands[3].toCharArray();
            MyLinkedList<Character> seq=new MyLinkedList<> 
(charArr.length);

Я не получаюточка инициализации вашего списка размером 4 каждый раз.Также обратите внимание, что он не будет инициализироваться с заданным размером, поскольку вы всегда переопределяете его с 0.

@Override
  public void insert(E item) {
    curr.setNext(new Node<E>(item, curr.Next()));
    if(tail==curr)
        tail=curr.Next();
    size++;

  }

Вы вообще не используете концепцию head , ваша первая вставкаЭто особый случай, и его нужно обрабатывать с умом.

 @Override
 public String toString() {
      String result = "";
      Node current = head;
      while(current.Next() != null){
          result += current.data();
          if(current.Next() != null){
              result += ", ";
          }
          current = current.Next();
      }
      return "" + result;
  }

head всегда будет нулевым, когда вы печатаете, это всегда приводит к тому, что первый элемент будет нулевым.Более того, когда вы находите узел, который затем указывает на нуль, вы должны использовать его данные.В вашем коде, прежде чем возвращать результат, вам также необходимо добавить данные из последнего элемента.

...