Java 发出读取文件并使用2D数组对数据进行排序的问题

Java 发出读取文件并使用2D数组对数据进行排序的问题,java,arrays,sorting,mapping,Java,Arrays,Sorting,Mapping,我正在做一个省分类程序,要求我必须让主类保持原样,然后做一个名为Munge的私有类,我已经做了几个小时了,修改了数百次代码,基本上它是从一个文本文件中读取的,看起来像这样 package lab5; import java.io.File; import java.util.Scanner; import java.util.Formatter; import java.io.FileNotFoundException; import java.util.ArrayList; import j

我正在做一个省分类程序,要求我必须让主类保持原样,然后做一个名为Munge的私有类,我已经做了几个小时了,修改了数百次代码,基本上它是从一个文本文件中读取的,看起来像这样

package lab5;

import java.io.File;
import java.util.Scanner;
import java.util.Formatter;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

public class Munge
{

private String inFileName, outFileName;
private Scanner inFile;
private Formatter outFile;
private int line = 0;

private String[] data;

public Munge(String inFileName, String outFileName)
{
    this.inFileName = inFileName;
    this.outFileName = outFileName;

    data = new String[100];
}

public void openFiles()
{
    try
    {
        inFile = new Scanner(new File(inFileName));
            File file = new File("input.txt");
            SortedMap<String, List<String>> map = new TreeMap<String, List<String>>();
            Scanner scanner = new Scanner(file).useDelimiter("\\n");
        while (scanner.hasNext()) {
            String newline = scanner.next();
            if (newline.contains(",")) {
            String[] parts = newline.split(",");
            String city = parts[0].trim();
            String province = parts[1].trim();
            List<String> cities = map.get(province);
            if (cities == null) {
                cities = new ArrayList<String>();
                map.put(province, cities);
            }
            if (!cities.contains(city)) {
                cities.add(city);
            }
            }   
        } 
            for (String province : map.keySet()) {
                StringBuilder sb = new StringBuilder();
                sb.append(province).append(": ");
                List<String> cities = map.get(province);
                for (String city : cities) {
                    sb.append(city).append(", ");
                }
                sb.delete(sb.length() - 2, sb.length());
                String output = sb.toString();
                System.out.println(output);
            } 
    }
    catch(FileNotFoundException exception)
    {
        System.err.println("File not found.");
        System.exit(1);
    }
    catch(SecurityException exception)
    {
        System.err.println("You do not have access to this file.");
        System.exit(1);
    }

    try
    {
        outFile = new Formatter(outFileName);  
    }
    catch(FileNotFoundException exception)
    {
        System.err.println("File not found.");
        System.exit(1);
    }
    catch(SecurityException exception)
    {
        System.err.println("You do not have access to this file.");
        System.exit(1);
    }
}

public void readRecords()
{
    while(inFile.hasNext())
    {
        data[line] = inFile.nextLine();
        System.out.println(data[line]);
        line++;
    }
}

public void writeRecords()
{
    for(int i = 0; i < line; i++)
    {
        String tokens[] = data[i].split(", ");
        Arrays.sort(tokens);

        for(int j = 0; j < tokens.length; j++)
            outFile.format("%s\r\n", tokens[j]);
    }
}

public void closeFiles()
{
    if(inFile != null)
        inFile.close();

    if(outFile != null)
        outFile.close();
}
}
安大略省汉密尔顿市
多伦多,安大略省
艾伯塔省埃德蒙顿市
阿尔伯塔省的马鹿
纽芬兰圣约翰教堂

需要像这样输出

package lab5;

import java.io.File;
import java.util.Scanner;
import java.util.Formatter;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

public class Munge
{

private String inFileName, outFileName;
private Scanner inFile;
private Formatter outFile;
private int line = 0;

private String[] data;

public Munge(String inFileName, String outFileName)
{
    this.inFileName = inFileName;
    this.outFileName = outFileName;

    data = new String[100];
}

public void openFiles()
{
    try
    {
        inFile = new Scanner(new File(inFileName));
            File file = new File("input.txt");
            SortedMap<String, List<String>> map = new TreeMap<String, List<String>>();
            Scanner scanner = new Scanner(file).useDelimiter("\\n");
        while (scanner.hasNext()) {
            String newline = scanner.next();
            if (newline.contains(",")) {
            String[] parts = newline.split(",");
            String city = parts[0].trim();
            String province = parts[1].trim();
            List<String> cities = map.get(province);
            if (cities == null) {
                cities = new ArrayList<String>();
                map.put(province, cities);
            }
            if (!cities.contains(city)) {
                cities.add(city);
            }
            }   
        } 
            for (String province : map.keySet()) {
                StringBuilder sb = new StringBuilder();
                sb.append(province).append(": ");
                List<String> cities = map.get(province);
                for (String city : cities) {
                    sb.append(city).append(", ");
                }
                sb.delete(sb.length() - 2, sb.length());
                String output = sb.toString();
                System.out.println(output);
            } 
    }
    catch(FileNotFoundException exception)
    {
        System.err.println("File not found.");
        System.exit(1);
    }
    catch(SecurityException exception)
    {
        System.err.println("You do not have access to this file.");
        System.exit(1);
    }

    try
    {
        outFile = new Formatter(outFileName);  
    }
    catch(FileNotFoundException exception)
    {
        System.err.println("File not found.");
        System.exit(1);
    }
    catch(SecurityException exception)
    {
        System.err.println("You do not have access to this file.");
        System.exit(1);
    }
}

public void readRecords()
{
    while(inFile.hasNext())
    {
        data[line] = inFile.nextLine();
        System.out.println(data[line]);
        line++;
    }
}

public void writeRecords()
{
    for(int i = 0; i < line; i++)
    {
        String tokens[] = data[i].split(", ");
        Arrays.sort(tokens);

        for(int j = 0; j < tokens.length; j++)
            outFile.format("%s\r\n", tokens[j]);
    }
}

public void closeFiles()
{
    if(inFile != null)
        inFile.close();

    if(outFile != null)
        outFile.close();
}
}
阿尔伯塔省;埃德蒙顿,马鹿
安大略;多伦多汉密尔顿
纽芬兰;圣约翰

我的主课是不变的,看起来是这样的

public class Lab5 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    if(args.length < 2) {
        System.err.println("Usage: java -jar lab5.jar infile outfile");
        System.exit(99);
    }

    Munge dataSorter = new Munge(args[0], args[1]);

    dataSorter.openFiles();
    dataSorter.readRecords();
    dataSorter.writeRecords();
    dataSorter.closeFiles();
    }
}
公共类Lab5{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
如果(参数长度<2){
System.err.println(“用法:java-jar lab5.jar infile outfile”);
系统出口(99);
}
Munge dataSorter=新的Munge(参数[0],参数[1]);
dataSorter.openFiles();
dataSorter.readRecords();
dataSorter.writeRecords();
dataSorter.closeFiles();
}
}
我做的芒奇课是这样的

package lab5;

import java.io.File;
import java.util.Scanner;
import java.util.Formatter;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

public class Munge
{

private String inFileName, outFileName;
private Scanner inFile;
private Formatter outFile;
private int line = 0;

private String[] data;

public Munge(String inFileName, String outFileName)
{
    this.inFileName = inFileName;
    this.outFileName = outFileName;

    data = new String[100];
}

public void openFiles()
{
    try
    {
        inFile = new Scanner(new File(inFileName));
            File file = new File("input.txt");
            SortedMap<String, List<String>> map = new TreeMap<String, List<String>>();
            Scanner scanner = new Scanner(file).useDelimiter("\\n");
        while (scanner.hasNext()) {
            String newline = scanner.next();
            if (newline.contains(",")) {
            String[] parts = newline.split(",");
            String city = parts[0].trim();
            String province = parts[1].trim();
            List<String> cities = map.get(province);
            if (cities == null) {
                cities = new ArrayList<String>();
                map.put(province, cities);
            }
            if (!cities.contains(city)) {
                cities.add(city);
            }
            }   
        } 
            for (String province : map.keySet()) {
                StringBuilder sb = new StringBuilder();
                sb.append(province).append(": ");
                List<String> cities = map.get(province);
                for (String city : cities) {
                    sb.append(city).append(", ");
                }
                sb.delete(sb.length() - 2, sb.length());
                String output = sb.toString();
                System.out.println(output);
            } 
    }
    catch(FileNotFoundException exception)
    {
        System.err.println("File not found.");
        System.exit(1);
    }
    catch(SecurityException exception)
    {
        System.err.println("You do not have access to this file.");
        System.exit(1);
    }

    try
    {
        outFile = new Formatter(outFileName);  
    }
    catch(FileNotFoundException exception)
    {
        System.err.println("File not found.");
        System.exit(1);
    }
    catch(SecurityException exception)
    {
        System.err.println("You do not have access to this file.");
        System.exit(1);
    }
}

public void readRecords()
{
    while(inFile.hasNext())
    {
        data[line] = inFile.nextLine();
        System.out.println(data[line]);
        line++;
    }
}

public void writeRecords()
{
    for(int i = 0; i < line; i++)
    {
        String tokens[] = data[i].split(", ");
        Arrays.sort(tokens);

        for(int j = 0; j < tokens.length; j++)
            outFile.format("%s\r\n", tokens[j]);
    }
}

public void closeFiles()
{
    if(inFile != null)
        inFile.close();

    if(outFile != null)
        outFile.close();
}
}
lab5包装;
导入java.io.File;
导入java.util.Scanner;
导入java.util.Formatter;
导入java.io.FileNotFoundException;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.SortedMap;
导入java.util.TreeMap;
公共课堂语言
{
私有字符串填充名,outFileName;
私人扫描仪填充;
专用格式化程序输出文件;
私有整数行=0;
私有字符串[]数据;
公共语言(字符串填充名、字符串输出名)
{
this.inFileName=inFileName;
this.outFileName=outFileName;
数据=新字符串[100];
}
公共void openFiles()
{
尝试
{
inFile=新扫描仪(新文件(inFileName));
File File=新文件(“input.txt”);
SortedMap map=新树映射();
Scanner Scanner=新的扫描仪(文件).useDelimiter(\\n”);
while(scanner.hasNext()){
字符串换行符=scanner.next();
if(换行符。包含(“,”){
String[]parts=newline.split(“,”);
字符串city=parts[0]。trim();
字符串省=零件[1]。修剪();
列表城市=map.get(省);
如果(城市==null){
城市=新阵列列表();
地图。放置(省、市);
}
如果(!cities.contains(城市)){
城市。添加(城市);
}
}   
} 
for(字符串省:map.keySet()){
StringBuilder sb=新的StringBuilder();
某人加上(省)。加上(“:”);
列表城市=map.get(省);
for(字符串城市:城市){
某人加上(城市)。加上(“,”);
}
删除(sb.length()-2,sb.length());
字符串输出=sb.toString();
系统输出打印项次(输出);
} 
}
捕获(FileNotFoundException异常)
{
System.err.println(“未找到文件”);
系统出口(1);
}
捕获(SecurityException异常)
{
System.err.println(“您无权访问此文件”);
系统出口(1);
}
尝试
{
outFile=新格式化程序(outFileName);
}
捕获(FileNotFoundException异常)
{
System.err.println(“未找到文件”);
系统出口(1);
}
捕获(SecurityException异常)
{
System.err.println(“您无权访问此文件”);
系统出口(1);
}
}
公共档案
{
while(infle.hasNext())
{
data[line]=infle.nextLine();
System.out.println(数据[行]);
line++;
}
}
公共无效书面记录()
{
对于(int i=0;i

请原谅我的括号,netbeans中的格式是正确的,但我不得不将底部的括号移到代码块中,因为我认为这是我的家庭作业,我将避免给您提供解决方案,但给出一些操作提示

当你读到一行时,它由市、省组成。所以你需要做的第一件事就是把绳子分成两部分。第二部分是省,第一部分是市。您需要为每个省创建一个集合,并将城市存储在正确的省集合中

一旦你有了这些,你就可以对找到的省份的名称进行排序,并对它们进行迭代。对省的城市进行排序,然后输出省名称和每个城市名称

有用的类可以是HashMap、TreeMap、List、Collections(具有排序方法)


希望这有助于你走得更远,否则,试着更具体地说明你所处的困境。

这听起来像是家庭作业,所以我添加了这个标签。你应该根据你目前在解决方案中面临的具体问题提出具体问题。您已经编写了一些代码,但没有给出它如何工作的任何指示。我怀疑您的代码不起作用,但您还没有真正提出任何问题。映射结果;//仔细选择地图和列表类型将使生活变得轻松愉快。result.put(省、市名称)add(新名称);正则表达式组匹配器将使解析变得微不足道。要实现的代码行数:15