通过对象字段过滤/排序集合?

时间:2014-03-22 20:31:31

标签: java sorting collections arraylist filter

我不确定为什么这不起作用。我不确定打印是否存在问题,或者方法本身是否存在问题。 我正在制作一个程序,它收集歌曲和过滤器的集合或根据给定的用户输入对其进行排序。用户应该能够输入多个命令以进一步缩小列表范围。

我的filterRank和filterYear方法工作得非常好,但是其他方法最终打印出看似随机选择的歌曲,这些歌曲不会改变,无论输入什么作为要过滤的标题或艺术家,这通常只出现在极长的等待期和一系列的空间。

即使在打印完这些混合的歌曲之后,程序也不会终止,并且会在控制台中定期输出空格,就像在System.out.println()语句中一样。

如果删除配置输出文件的代码(这是项目的要求),则方法无法完全打印。无论这些变化如何,filterRank和filterYear都能继续完美运行。

我的排序方法也会出现此问题。无论我运行什么样的方法,它仍会打印出空格和随机歌曲,或者根本不打印。

我有什么遗失的东西吗?我已经尝试打印出变量并在我的程序中策略性地插入System.out.println(" test")以确定程序是什么,但似乎它正在解析输入正确,并且方法确实正在成功运行。 我无法解决问题。

我可以帮助确定我失踪的内容吗?尽管对我的代码进行了两个小时的研究,但我无法弄清楚我的逻辑错误是什么。

以下是相关代码:

主要班级:

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

//user greeting statements and instructions
//scanning file, ArrayList declaration


    Scanner input = new Scanner(System.in);

    while (input.hasNextLine()) {
        int n = 0;
        SongCollection collection = new SongCollection(songs);
        String inputType = input.nextLine();
        String delims = "[ ]";
        String[] tokens = inputType.split(delims);
        for (int i = 0; i < tokens.length; i++) {
            n = 0;
            if (n == 0) {
                if ((tokens[i]).contains("year:")) {
                    collection.filterYear(Range.parse(tokens[i]));
                    n = 1;
                }// end of year loop
                if ((tokens[i]).contains("rank:")) {
                    collection.filterRank(Range.parse(tokens[i]));
                    n = 1;
                }// end of rank
                if ((tokens[i]).contains("artist:")) {
                    collection.filterArtist(tokens[i]);
                    n = 1;
                }// end of artist
                if ((tokens[i]).contains("title:")) {
                    collection.filterTitle(tokens[i]);
                    n = 1;
                }// end of title
                if ((tokens[i]).contains("sort:")) {
                        if ((tokens[i]).contains("title")) {
                            collection.sortTitle();
                            n = 1;
                        }// end of sort title
                        if ((tokens[i]).contains("artist")) {
                            collection.sortArtist();
                            n = 1;
                        }// end of sort artist
                        if ((tokens[i]).contains("rank")) {
                            collection.sortRank();
                            n = 1;
                        }// end of sort rank
                        if ((tokens[i]).contains("year")) {
                            collection.sortYear();
                            n = 1;
                        }// end of sort year
                }//end of sort
            }// end of for loop

        }// end of input.hasNextline loop
        /*final PrintStream console = System.out; //saves original System.out
        File outputFile = new File("output.txt"); //output file
        PrintStream out = new PrintStream(new FileOutputStream(outputFile)); //new FileOutputStream
        System.setOut(out); //changes where data will be printed
           */           System.out.println(collection.toString()); 

        /*System.setOut(console); //changes output to print back to console
        Scanner outputFileScanner = new Scanner(outputFile); //inputs data from file
        while ((outputFileScanner.hasNextLine())) { //while the file still has data
            System.out.println(outputFileScanner.nextLine()); //print
        }
        outputFileScanner.close();
        out.close();*/
    }
}// end of main
}// end of class

SongCollection类,包含所有相应的过滤和排序方法:

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


    public class SongCollection {
ArrayList<Song> songs2;
ArrayList<Song> itemsToRemove = new ArrayList<Song>(); // second collection
                                                        // for items to
                                                        // remove
public SongCollection(ArrayList<Song> songs) { // constructor for SongCollection
    System.out.println("Test"); 
    this.songs2 = songs;
    }
public void filterYear(Range r) {
    int n = 0;
    if (n == 0) {
        System.out.println("Program is processing.");
        n++;
        for (Song song1 : songs2) {
            if (song1.year > (r.getMax()) || (song1.year) < (r.getMin())) {
                itemsToRemove.add(song1);
            }
        }
        songs2.removeAll(itemsToRemove);
        itemsToRemove.clear();
    }
}

public void filterRank(Range r) {
    int n = 0;
    if (n == 0) {
        System.out.println("Program is processing.");
        n++;
        for (Song song1 : songs2) {
            if (song1.rank > (r.getMax()) || (song1.rank) < (r.getMin())) {
                itemsToRemove.add(song1);
            }
        }
        songs2.removeAll(itemsToRemove);
        itemsToRemove.clear();
    }
}

public void filterArtist(String s) {
    int n = 0;
    if (n == 0) {
        System.out.println("Program is processing.");
        n++;
        for (Song song1 : songs2) {
            if ((!(((song1.artist).contains(s))))) {
                itemsToRemove.add(song1);
            }
        }
        songs2.removeAll(itemsToRemove);
        itemsToRemove.clear();
    }
}

public void filterTitle(String s) {
    int n = 0;
    if (n == 0) {
        System.out.println("Program is processing.");
        n++;
        for (Song song1 : songs2) {
            if ((!(((song1.title).contains(s))))) {
            itemsToRemove.add(song1);
            }
        }
        songs2.removeAll(itemsToRemove);
        itemsToRemove.clear();
    }
}

public void sortTitle() {
      Collections.sort(songs2, SongComparator.byTitle()); // now we have a sorted list
    }
public void sortRank() {
      Collections.sort(songs2, SongComparator.byRank()); // now we have a sorted list
    }
public void sortArtist() {
      Collections.sort(songs2, SongComparator.byArtist()); // now we have a sorted list
    }
public void sortYear() {
      Collections.sort(songs2, SongComparator.byYear()); // now we have a sorted list
    }
public String toString() {
    String result = "";
    for (int i = 0; i < songs2.size(); i++) {
        result += " " + songs2.get(i);
    }

    return result;

}
}

SongComparator课程:

import java.util.Comparator;

public class SongComparator implements Comparator<Song> {
public enum Order{
    YEAR_SORT, RANK_SORT, ARTIST_SORT, TITLE_SORT
}
private Order sortingBy;
public SongComparator(Order sortingBy){
    this.sortingBy = sortingBy;
}
public static SongComparator byTitle() {
    return new SongComparator(SongComparator.Order.TITLE_SORT);
}
public static SongComparator byYear() {
    return new SongComparator(SongComparator.Order.YEAR_SORT);
}
public static SongComparator byArtist() {
    return new SongComparator(SongComparator.Order.ARTIST_SORT);
}
public static SongComparator byRank() {
    return new SongComparator(SongComparator.Order.RANK_SORT);
}

@Override
public int compare(Song song1, Song song2) {
    switch (sortingBy) {
    case YEAR_SORT:
        System.out.println("test");
        return Integer.compare(song1.year, song2.year);
    case RANK_SORT:
        System.out.println("test");
        return Integer.compare(song1.rank, song2.rank);
    case ARTIST_SORT:
        System.out.println("test");
        return song1.artist.compareTo(song2.artist);
    case TITLE_SORT:
        System.out.println("test");
        return song1.title.compareTo(song2.title);
    }
    throw new RuntimeException(
            "Practically unreachable code, can't be thrown");
    }

}

1 个答案:

答案 0 :(得分:0)

输出过滤后的集合后,程序不会终止,因为您仍处于while循环中,正在寻找下一个用户输入行。这基本上就是你的程序正在做的事情:

    while (input.hasNextLine()) {

        // stuff happens here

        System.out.println(collection.toString());

        /*
         * System.setOut(console); //changes output to print back to console Scanner outputFileScanner = new Scanner(outputFile); //inputs data from file while ((outputFileScanner.hasNextLine()))
         * { //while the file still has data System.out.println(outputFileScanner.nextLine()); //print } outputFileScanner.close(); out.close();
         */
    }