0

完整的项目是从一个文件中获取数据,该文件是一个文本文件,其中包含所有 201 个国家/地区的列表以及它们按字母顺序排列的各自互联网使用率。这是一个例子

Afghanistan                 7
Albania                    63
Algeria                    20
Andorra                    97
Angola                     23
...

有了这个,我们必须以数字方式(特别是)对数据进行 Shellsort。我已经成功地做到了这一点,但我只输出了一个百分比列表,因为我还需要列出的国家。这是我的代码:

import java.io.*;
import java.util.*;

public class InternetUsers {
public static void main(String[] args) throws IOException{
    // TODO Auto-generated method stub

    String populationString = "";
    String[] line = new String[201];
    int populations[] = new int[201];   

    Scanner fileIN = new Scanner(new File("F:/CountrySortedAlpha.txt"));

    while(fileIN.hasNext()){
        for(int i = 0; i < 201; i++){
            populationString = fileIN.nextLine().substring(26, 29);
            populations[i] = Integer.parseInt(populationString.trim());
        }   
        int j;
            for(int gap = populations.length / 2; gap > 0; gap /= 2){
                for (int k = 0; k < populations.length; k++){   
                }
                for (int t = gap; t < populations.length; t++){
                    int tmp = populations[t];
                        for(j = t; j >= gap && (tmp < populations[j - gap]); j -= gap){
                            populations[j] = populations[j - gap];
                        }
                        populations[j] = tmp;
                }
        }
        System.out.println("\nFinal sorted order: ");
        for(int k = 0; k < populations.length; k++){
            System.out.print(populations[k]);
            System.out.println("");
        }
        System.out.println();
    }   
}
}

所以我的问题是我该如何输出这些国家呢?我需要完全重做我的排序方式吗?这是我的示例输出:

 Final sorted order: 
 1
 1
 2
 2
 2
 2
 2
 3
 ....
4

2 回答 2

0

除非教授。说专门用国家的字符串数组和费率的整数数组来做,@ScaryWombat 的想法是每个包含一个字符串和一个整数的对象数组的想法是要走的路。

话虽如此,如果必须,您仍然可以使用单独的数组来完成当您的排序算法需要交换时,请确保交换theline population条目,而不仅仅是population条目。

于 2017-05-02T01:38:20.527 回答
0

解析文件时,需要将解析后的值存储在字典或其他结构中。排序后,打印时,从字典中读取值。

我修改了您的代码以将值存储在字典中,并在我添加/修改的行中添加了注释。我没有碰你的排序算法,所以你仍然在同一个数组上排序:

public static void main(String[] args) throws IOException {
    String populationString = "";
    String[] line = new String[201];
    int populations[] = new int[201];

    // Have a dictionary that can store the values you parse
    Map<Integer, String> dictionary = new HashMap<Integer, String>();

    Scanner fileIN = new Scanner(new File("F:/CountrySortedAlpha.txt"));

    while (fileIN.hasNext()) {
        for (int i = 0; i < 201; i++) {
            // Parse the whole line, this 29 hard coded seems incorrect
            populationString = fileIN.nextLine().substring(0, 29);
            // Grab both values
            String[] splited = populationString.split("\\s+");
            // Country name can have spaces, so take the last elemnt
            populations[i] = Integer.parseInt(splited[splited.length - 1]);
            // Join back values
            String country = populationString.join(" ", splited);
            // Cut off the rate number
            country = country.substring(0, country.lastIndexOf(" "));
            // Store them in your dictionary
            if (dictionary.containsKey(populations[i])) {
                // If multiple countries have same rate, add them to value, and separate with comma
                String value = dictionary.get(populations[i]);
                dictionary.put(populations[i], value + "," + country);
            } else {
                dictionary.put(populations[i], country);
            }
        }
        int j;
        for (int gap = populations.length / 2; gap > 0; gap /= 2) {
            for (int t = gap; t < populations.length; t++) {
                int tmp = populations[t];
                for (j = t; j >= gap && (tmp < populations[j - gap]); j -= gap) {
                    populations[j] = populations[j - gap];
                }
                populations[j] = tmp;
            }
        }
        System.out.println("Final sorted order: ");
        for (int k = 0; k < populations.length; k++) {
            // Read the value from dictionary
            String value = dictionary.get(populations[k]);
            // For duplicates skip, that entry gets deleted after values were printed
            if (value == null) {
                continue;
            }

            // If multiple countries had the same rate, they were stored as comma separated value
            String[] countries = value.split(",");
            for (String country : countries) {
                // You can print rate, or country, or both
                System.out.println(populations[k] + " " + country);
            }

            // Remove from dictionary, because we already printed all countries with the same rate
            dictionary.remove(populations[k]);
        }
        System.out.println();
    }

    // Don't forget to close the file
    fileIN.close();
}
于 2017-05-02T01:39:16.820 回答