将随机整数输入到文件中并将它们排序到另一个文件中? FileIO专注

时间:2018-01-10 02:33:18

标签: java file sorting

我正在尝试创建一个FileIO,其中随机数放入.txt文件并输出,并在另一个.txt文件中排序。我有一个可以对数字进行排序的冒泡排序代码。我有另一个代码,生成一个.txt文件。我不确定我是如何一起实施这两个的。

这是我的fileIO代码:

public static void main(String[] args) {
    File file = new File("test.txt");

    //Writes name and age to the file

    try {
        PrintWriter output = new PrintWriter(file);
        output.println("Rober");
        output.println(27);
        output.close();
    } catch (IOException ex) {
        System.out.printf("ERROR: %s\n", ex);
    }

    //Reads from the file
    try {
        Scanner input = new Scanner(file);
        String name = input.nextLine();
        int age = input.nextInt();

        System.out.printf("Name: %s Age %d\n", name, age);
    } catch (FileNotFoundException ex) {
        System.out.printf("ERROR: %s\n", ex);
    }
}

这是我的冒泡分类代码:

public static void main(String[] args) {

    Random num = new Random();

    //Creating an array for 10 integers
    int [] number = new int [10];

    System.out.print("Random Numbers:");

    /*Display the unsorted numbers in a random order.
    These numbers range from 0 to 100
    */
    for (int d = 0 ; d<number.length ; d++){
        /* We add a "+1" to the nextInt(100) here because then the numbers
        will only range from 0 to 99.
        */
        int RandomG = num.nextInt(100)+1;
        number[d] = RandomG;
        System.out.print(" " +RandomG);
    }

    //Display the sorted numbers
    System.out.print("\nSorted Numbers:"+Arrays.toString(BubbleSortAsceMethod(number)));
}

public static int [] BubbleSortAsceMethod(int[] number){
    int placeholder;

    for(int i = 0 ; i < number.length-1 ; i++){
        for ( int x = 1 ; x < number.length-i ; x++){

            /*If the first number in the sequence is greater than the second
            number, than save the first number of sequence in placeholder 
            and place the second number in the first numbers position, and 
            put the placeholder in the second numbers position (SWAP).
            */

            /*
             Since this is saying that when the first term is bigger than the
            2nd term, the sequence will increase. If we flip the relational
            operator, the sequence will decrease.
            */

            if ( number[x-1] < number[x]){ 
                placeholder = number[x-1];
                number[x-1] = number[x];
                number[x] = placeholder;
            }
        }
    }
    return number;
}

我对所有这些java东西都是新手,所以请对我有点容易!任何帮助都表示赞赏:)

1 个答案:

答案 0 :(得分:0)

由于文件中包含的数据将包含一对值:名称(String)和年龄(int),您需要保留它们的关系。这样做的最佳方法是创建一个Class来表示数据。最终,您希望使用BubbleSort方法对年龄数据进行排序。虽然实际上这不是您排序数据的首选,但我认为这是一项要求。您通过将每个条目与其直接邻居进行比较,对您排序int[]的BubbleSort方法进行排序。如果int是原始的,您可以使用<运算符直接比较每个元素。

public class Person implements Comparable<Person> {
    private String name;
    private int age;
    public Person(String name, int age) {
       this.age = age;
       this.name = name;
    }

    public String getName() { return name; }
    public int getAge() { return age; }

    @Override
    public String toString() { 
        return name + System.lineSeperator() + age; 
    }

    @Override
    public int compareTo(Person person) {
        return this.age - person.age;
    }
}

您可能希望实现Comparable接口来比较对象;其中必须通过覆盖compareTo(Person person)方法来实现接口。您可以通过返回年龄差异来对年龄进行排序。这不是您可以强制执行所需订单的唯一方式;您可能希望使用每个对象的getAge()直接比较或创建Comparator对象。

使用Comparable接口确实允许您使BubbleSort类更通用(但是数组必须是实现接口的对象;因此没有基本类型)。

public class BubbleSort {
    public static <T extends Comparable> T[] BubbleSortAsceMethod(T[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            for (int x = 1; x < array.length - i; x++) {
                if (comparator.compare(array[x - 1], array[x]) < 0) {
                    T placeholder = array[x - 1];
                    array[x - 1] = array[x];
                    array[x] = placeholder;
                }
            }
        }
        return array;
    }
} 

您会注意到此排序方法与原始方法略有不同,即引入generic type parametersBubbleSortAsceMethod方法签名。再次,这是完全可选,但这确实使您可以灵活地在将来使用此方法扩展Comparable接口的其他类数组。

如果您不想使用泛型或Comparable界面,则需要更改方法签名和if语句。 您的方法签名应该看起来像public static Person[] BubbleSortAsceMethod(Person[] array)和if语句if (array[x-1].getAge() < array[x].getAge())

这可以让你举例说明它的工作原理,虽然这并不考虑你应该很容易实现的文件io。

static Random random = new Random();

public static void main (String args[]) {
    int size = 100;
    Person[] peopleArray = new Person[size];
    for (int i = 0; i < size; i++) {
        String name = generateName(random.nextInt(4) + 4);
        int age = random.nextInt(100);
        peopleArray[i] = new Person(name, age);
    }
    peopleArray = BubbleSort.BubbleSortAsceMethod(peopleArray);
}

注意,这至少尽可能地符合您迄今为止实施的代码。如果BubbleSort和数组的使用并不重要,那么实现List接口的数据结构(例如ArrayList)可以让您实现更清洁。这根本不使用BubbleSort方法。

public static void main (String args[]) {
    int size = 100;
    ArrayList<Person> people = new ArrayList<>();
    for (int i = 0; i < size; i++) {
       String name = generateName(random.nextInt(4) + 4);
       int age = random.nextInt(100);
       people.add(new Person(name, age));
    }
    peopleList.sort(Person::compareTo);
    //or, if you don't want to implement comparable
    peopleList.sort(Comparator.comparing(Person::getAge));
}

附录:

用于说明目的:生成设定长度的名称(随机)。

static char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();

public static String generateName(int length) {
    if (length > 0) {
        return alphabet[random.nextInt(alphabet.length)] + generateName(length - 1);
    }
    return "";
}