2017-03-09 9 views
0

異なる並べ替えフィールドでファイルからオブジェクトのArrayListを並べ替える必要があるプロジェクトを終了しています。すべてうまく動作しますが、私は1つのバグに遭遇しています。コードを実行すると、ファイルオブジェクトは元の順序で印刷され、ソートは行われません。オブジェクトのArrayListの並べ替え(並べ替え後に変更されていないArrayList)

私はコレクションクラスで使用しているインスタンス変数がソート後に変更されていないことは間違いないと確信していますが、これを修正する方法はわかりません。

は、ここに私のクライアントクラスである:

static int bpCount; 
static String gene; 
static int year; 
static String yearString; 
static String definition; 
static String definitionString; 
static String origin; 
static String s; 

public static void main(String[] args) throws FileNotFoundException{ 


    ArrayList<VirusObject> virusList = new ArrayList<VirusObject>(); 
    VirusCollection viruses = new VirusCollection(virusList); 

    String folderName = "virusfiles"; 
    Scanner in = new Scanner(System.in); 

    System.out.println("Hello user, this program you are about to use will sort and filter a large selection of virus files that contain various virus genre"); 

    System.out.println("Do you want to load a directory or file?"); 

    String userInput = in.nextLine(); 

    if(userInput.equals("file")){ 

     openViruses(virusList, folderName); 

    } 

    Scanner userIn = new Scanner(System.in); 

    System.out.println("The current commands are sort, filter, and quit. Choose your commmand: "); 

    String input = userIn.nextLine(); 

    if(input.equals("sort")){ 
     Scanner userInput3 = new Scanner(System.in); 
     System.out.println("The current sorting methods are definition, reference, origin, year, and gene. Choose your sort: "); 
     String sort = userInput3.nextLine(); 

     if(sort.equals("definition")){ //runs sort on temporary array, then runs print method 

      viruses.sortDef(); 
      viruses.printViruses(); 

     } 
     if(sort.equals("reference")){ 

      viruses.sortRef(); 
      viruses.printViruses(); 

     } 
     if(sort.equals("origin")){ 

      viruses.sortOrg(); 
      viruses.printViruses(); 

     } 
     if(sort.equals("year")){ 

      viruses.sortYr(); 
      viruses.printViruses(); 

     } 
     if(sort.equals("gene")){ 

      viruses.sortGn(); 
      viruses.printViruses(); 

     } 

     if(sort.equals("quit")){ 
      System.out.println("Have a good day buddy"); 
      return; 

     } 
    } 

    if(input.equals("filter")){ 
     Scanner userInput2 = new Scanner(System.in); 
     System.out.println("The current filters are definition, reference, origin, year, and gene. Choose your filter: "); 
     String filter = userInput2.nextLine(); 

     if(filter.equals("definition")){ 

      System.out.println("What definition do you want to filter out?"); 
      String defFilter = userInput2.nextLine(); 
      viruses.printViruses(); 

     } 
     if(filter.equals("reference")){ 

      System.out.println("Enter a reference or range: "); 
      String refRange = userInput2.nextLine(); 
      viruses.filterYear(Range.parse(refRange)); 
      viruses.printViruses(); 

     } 
     if(filter.equals("origin")){  

      System.out.println("What origin do you want to filter out?"); 
      String originFilter = userInput2.nextLine(); 
      viruses.filterDefinition(originFilter); 
      viruses.printViruses(); 

     } 
     if(filter.equals("year")){ 

      System.out.println("Enter a year or range: "); 
      String yearRange = userInput2.nextLine(); 
      viruses.filterYear(Range.parse(yearRange)); 
      viruses.printViruses(); 

     } 
     if(filter.equals("gene")){ 

      System.out.println("What gene do you want to filter out?"); 
      String geneFilter = userInput2.nextLine(); 
      viruses.filterDefinition(geneFilter); 
      viruses 
      .printViruses(); 

     } 

     if(filter.equals("quit")){ 
      System.out.println("Have a good day buddy"); 
      return; 

     } 
    } 
} 

public static int openViruses(ArrayList<VirusObject> virusList, String folderName) throws FileNotFoundException { 
    File folder = new File(folderName); 
    File[] listOfFiles = folder.listFiles(); 
    int countOfFiles = 0; 

    for (int i = 0; i < listOfFiles.length; i++) { 
     if (listOfFiles[i].isFile()) { 
      System.out.println("File " + listOfFiles[i].getName()); 
      parseFile(virusList, listOfFiles[i]);//parseFile provided by student! 
      countOfFiles++; 

     } else if (listOfFiles[i].isDirectory()) { 
      System.out.println("Directory ignored: " + listOfFiles[i].getName()); 
     } 
    } 

    return countOfFiles; 
} 

public static void parseFile(ArrayList<VirusObject> virusList, File File1) throws FileNotFoundException{ 

    Scanner readFile = new Scanner(File1); 

    while(readFile.hasNextLine()){ 

     String virusString = readFile.nextLine(); 
     Scanner in = new Scanner(virusString); 

     if(virusString.contains("LOCUS")){ 

      in.next(); 
      in.next(); 
      bpCount = in.nextInt(); 
      in.next(); 

      gene = in.next(); 
      in.next(); 
      in.next(); 
      yearString = in.next(); 
      Scanner in2 = new Scanner(yearString); 
      in2.useDelimiter("-"); 
      in2.next(); 
      in2.next(); 
      year = in2.nextInt(); 

     } 

     if(virusString.contains("DEFINITION")){ 

      definitionString = in.nextLine(); 
      definition = definitionString.split("\\.")[0]; 


     } 

     if(virusString.contains("ORIGIN")){ 
      if(virusString.contains("1")); 
       origin = in.nextLine(); 

      }  
     } 


    VirusObject Virus = new VirusObject(bpCount, gene, year, definition, origin); 
    virusList.add(Virus); 

    } 
} 

、ここですべてがソートされたクラスです。

public ArrayList<VirusObject> virusList; 

public VirusCollection(ArrayList<VirusObject> viruses){ 

    virusList = viruses; // placeholder to reach filters and sorts (temporary array) 

} 

public void sortDefinition(VirusObject[] viruses){ 

    int i; 
    int j; 

    for (j = 1; j < viruses.length; j++){ 
     VirusObject temp = viruses[j]; 
     i = j; 

     while (i> 0 && viruses[i - 1].getDefinition().compareTo(temp.getDefinition()) > 0){ // compareTo method used to compare string to 0 
      viruses[i] = viruses[i - 1]; 
      --i; 
     } 

     viruses[i] = temp; 
    } 


} 

public void sortReference(VirusObject[] viruses){ 

    int i; 
    int j; 

    for (j = 1; j < viruses.length; j++){ 
     VirusObject temp = viruses[j]; 
     i=j; 


     while (i > 0 && viruses[i - 1].getReference() > 0){ 
      viruses[i] = viruses[i - 1]; 
      --i; 
     } 

     viruses[i] = temp; 
    } 


} 

public void sortYear(VirusObject[] viruses){ 

    int i; 
    int j; 

    for (j = 1; j < viruses.length; j++){ 
     VirusObject temp = viruses[j]; 
     i = j; 

     while (i > 0 && viruses[i - 1].getYear() > temp.getYear()){ 
      viruses[i] = viruses[i - 1]; 
      --i; 
     } 

     viruses[i] = temp; 
    } 


} 

public void sortOrigin(VirusObject[] viruses){ 

    int i; 
    int j; 

    for (j = 1; j < viruses.length; j++){ 
     VirusObject temp = viruses[j]; 
     i = j; 

     while (i > 0 && viruses[i - 1].getOrigin().compareTo(temp.getOrigin()) > 0){ 
      viruses[i] = viruses[i - 1]; 
      --i; 
     } 

     viruses[i] = temp; 
    } 


} 

public void sortGene(VirusObject[] viruses){ 

    int i; 
    int j; 

    for (j = 1; j < viruses.length; j++){ 
     VirusObject temp = viruses[j]; 
     i = j; 

     while (i > 0 && viruses[i - 1].getGene().compareTo(temp.getDefinition()) > 0){ 
      viruses[i] = viruses[i - 1]; 
      --i; 
     } 

     viruses[i] = temp; 
    } 
} 

public void printViruses(){ 

    for (final VirusObject Virus : virusList){ 
     System.out.println(Virus.toString()); 
    } 
} 

public void sortDef(){ 

    VirusObject[] array = virusList.toArray(new VirusObject[virusList.size()]); // runs the sorting methods on a temporary array, makes it available to client as method 
    sortDefinition(array); 

} 

public void sortRef(){ 

    VirusObject[] array = virusList.toArray(new VirusObject[virusList.size()]); 
    sortReference(array); 

} 

public void sortYr(){ 

    VirusObject[] array = virusList.toArray(new VirusObject[virusList.size()]); 
    sortYear(array); 


} 

public void sortOrg(){ 

    VirusObject[] array = virusList.toArray(new VirusObject[virusList.size()]); 
    sortOrigin(array); 

} 

public void sortGn(){ 

    VirusObject[] array = virusList.toArray(new VirusObject[virusList.size()]); 
    sortGene(array); 

    } 
} 

ご協力いただければ幸いです。ありがとうございました

+1

なぜ独自のソートを作成し、組み込みソートメソッドを使用しなかったのですか? –

+0

[mcve]を作成します。並べ替えとは何の関係もないコードを大量に置いていますか? – GhostCat

+0

@JimGarrison私たちの先生は、Collections.sortの代わりに独自のメソッドを書くことを欲しかった –

答えて

1

の配列をリストと同じ値で作成し、その配列をソートすると、virusList.toArray(...)と呼びます。並べ替えられた配列がありますが、元のリスト(virusList)は変更されていません。ソートした結果をvirusListArrayListなどに変換)に更新する必要があります。

+0

ありがとうございます。あなたの説明ははっきりしていて、理解しやすいものでした。 –

0

並べ替えを行う各メソッドで、リストから配列への参照をコピーし、次に配列を並べ替えます。次に、印刷はvirusListを使用して印刷します。ソートされた参照は決してvirusListに戻されません。そこ根底にあるリストを並べ替えなど、あなたがこれを解決することができ、多くの異なる方法が、ありますが、あなたのコードに最小限の変更は、おそらくです:

public void sortDef(){ 

    VirusObject[] array = virusList.toArray(new VirusObject[virusList.size()]); // runs the sorting methods on a temporary array, makes it available to client as method 
    sortDefinition(array); 
    virusList = new ArrayList<VirusObject>(Arrays.asList(array)); 
} 

し、すべてのソートメソッドに対して同様の変更を行います。

+0

これは問題を解決しました。ご協力いただきありがとうございます。今、私は分かる! –

1

あなたの間違いはありますか?

あなたは、たとえば、ユーザの入力に基づいてソート関数を呼び出す:

viruses.sortDef(); 

あなたはArrayListのにあなたのコレクションのすべての要素を転送して、代わりにそのArrayListのをソートしています。

これは、ここで作成した一時的なArrayListのインスタンスのソートを実装:

VirusObject[] array = virusList.toArray(new VirusObject[virusList.size()]); // runs the sorting methods on a temporary array, makes it available to client as method 

そして、あなたはそれで何も操作を行わなかったため、あなたの実際のコレクションのインスタンスは、ソートされていないままに!

+0

ご協力ありがとうございます!あなたの説明は、何が間違っていたのか理解する助け –

関連する問題