在Java中读取文件并将其存储到2D对象数组中?

在Java中读取文件并将其存储到2D对象数组中?,java,file,object,multidimensional-array,Java,File,Object,Multidimensional Array,我有一个Java项目,我正试图做(为了好玩),但我在这一步中挣扎。我试图阅读两个国家的城市,美国和中国,我在阅读文件时遇到了麻烦。我试图用一个分隔符来分隔中国和美国的城市 这是我的文本文件“Cities.txt” 旧金山9874343 543443 193838 洛杉矶3900000 52000 22000 巴尔的摩622104 34423 1234 休斯顿2196000 45444 29393 纽约市850万54000 27000 费城1510000 654334 21343 波士顿64233

我有一个Java项目,我正试图做(为了好玩),但我在这一步中挣扎。我试图阅读两个国家的城市,美国和中国,我在阅读文件时遇到了麻烦。我试图用一个分隔符来分隔中国和美国的城市

这是我的文本文件“Cities.txt”

旧金山9874343 543443 193838

洛杉矶3900000 52000 22000

巴尔的摩622104 34423 1234

休斯顿2196000 45444 29393

纽约市850万54000 27000

费城1510000 654334 21343

波士顿6423344 345334 13443

芝加哥2719000 39000 19282

圣地亚哥1323343 432343 18374

达拉斯1258000 423343 17363|

北京21500000324543454

杭州大学9018000 32343 192828

上海24500000432345 23444

广州208006543345298383

武汉10670000 54344 302344

汕头5391028 43345 23235

香港7234800 39039 278383

澳门650900 34543 17364

深圳106300004434319883

淄博2980000493832009

这是我的主要Java类。我还有一个Cities类,包含构造函数、getter/setter和toString()

静态城市[][]多=新城市[2][10];
公共静态void main(字符串[]args)引发FileNotFoundException{
println(“本程序的目的是比较美国和中国这两个超级大国的不同城市。”);
System.out.println(“中城市中的信息存储在对象的2D数组中,并在文本文件中预先创建。\n请选择一个选项来操作数组中的信息。”);
扫描仪输入=新扫描仪(系统输入);
字符串名称=”;
整数总体=0;
双倍工资=0.0;
int密度=0;
城市=新城市(名称、人口、工资、密度);
布尔退出=假;
可读性(名称);
String options=“1).打印所有城市。\n 2).仅打印美国城市。\n 3).仅打印中国城市\n 90).退出程序”;
System.out.println(选项);
int decise=in.nextInt();
当(!退出)
{
开关(决定){
案例1:
{
printarray(姓名、人口、工资、密度);
}
案例2:{
}
案例3:{
}
案例90:{
退出=真;
}
}
}
}
公共静态城市readcity(字符串fline)
{
试一试{
字符串名称;整数总体;双工资;整数密度;
国际国家=2;国际城市=10;
Scanner fileScan=new Scanner(新文件(“/src/Cities.txt”);
fileScan.useDelimiter(“|”);
while(fileScan.hasNext()){
name=fileScan.next();
population=fileScan.nextInt();
wage=fileScan.nextDouble();
密度=fileScan.nextInt();
城市=新城市(名称、人口、工资、密度);
返回新城市(名称、人口、工资、密度);
}
fileScan.nextLine();
城市=readcity(弗林);
多[国家][城市]=城市;
回归城市;
}
捕获(例外e){
System.out.println(“看起来好像有错误。”);
}
城市=readcity(弗林);
回归城市;
}
公共静态void printary(字符串名称、整数填充、双倍工资、整数密度)引发FileNotFoundException{
城市=新城市(名称、人口、工资、密度);
for(int row=0;row

该方法似乎在进行无限递归调用,但我想知道如何解决这个问题。我会对两个文件执行相同的方法并以这种方式实现吗?或者我会把它们拿出来在城市里阅读,并通过不同的方法实现它们?我在文件处理方面很弱,使用2d阵列甚至比这更重要。试图修正我的弱点,这样你能给我的任何帮助都是有益的

那么,我从哪里开始

  • 您的readcity()方法正在递归地调用自身。我不认为这是个好主意。尝试删除这些呼叫
  • 您对readcity()的初始调用是使用参数“”。我不知道这里的意图是什么
  • 在上面的代码中,“while(fileScan.hasNext())”之后的括号“{”显然丢失了
  • 一般来说,试着根据它们的复数来命名类和变量。如果一个对象应该包含一个城市,那么它的类应该称为“城市”。如果一个对象应该包含一组城市,那么你可以将该类称为“城市”

  • 在这种情况下,从文件中读取数据不需要递归。我绝对建议编写注释,以便外部用户了解基本情况。嗯。我还可以使从文件中获取数据变得更容易,因为我假设您在文件处理方面没有太多经验

    我重新格式化了文件,使事情在某种意义上变得更简单。这样,你就可以通过使用split在“,”之间获得每个信息

    US:
    San Francisco, 9874343, 543443, 193838
    Los Angeles, 3900000, 52000, 22000
    Baltimore, 622104, 34423, 1234
    Houston, 2196000, 45444, 29393
    New York City, 8500000, 54000, 27000
    Philadelphia, 1510000, 654334, 21343
    Boston, 6423344, 345334, 13443
    Chicago, 2719000, 39000, 19282
    San Diego, 1323343, 432343, 18374
    Dallas, 1258000, 423343, 17363
    China:
    Beijing, 21500000, 32454, 23454
    Hangzhouu, 9018000, 32343, 192828
    Shanghia, 24500000, 432345, 23444
    GuangZhou, 20800654, 323455, 298383
    Wuhan, 10670000, 54344, 302344
    Swatow, 5391028, 43345, 23235
    Hong Kong, 7234800, 39039, 278383
    Macau, 650900, 34543, 17364
    Shenzhen, 10630000, 44343, 19883
    Zibo, 2980000, 49383, 20009
    
    这是我用来读取数据并存储在2d城市数组中的类

    public class CityReader {
    
    
        public static void main(String[] args)
        {
    
            City[][] cities = new City[2][10];
            readFileInto2D("src/Cities.txt",cities);
            //User prompt on what they want to here?    
            print2DArray(cities);
        }
    
        public static void readFileInto2D(String filename,City[][] cities)
        {
            City city;
            String name = "";
            int population = 0;
            int wage = 0;
            int density = 0;
    
            try {
    
                Scanner scan = new Scanner(new File(filename));
    
                String line;
                String[] parsed;
    
                //Read US:
                if(scan.hasNext())
                    line = scan.nextLine();
    
                //Keep track of rows
                int indexer = 0; 
                //Keep track of columns
                int indexer2 = 0;
    
                while(scan.hasNext())
                {
                    line = scan.nextLine();
    
                    if(line.contains("China"))
                    {
                        indexer += 1;//Go to next row
                        indexer2 = 0;//Start index at beginning of column.
                        line = scan.nextLine();//Read next line, ignore line with China.
                    }
                    parsed = line.split(", "); //This splits each line 
                                               //into an array of name,pop,wage,and density
                    name = parsed[0];
                    population = Integer.parseInt(parsed[1]);
                    wage = Integer.parseInt(parsed[2]);
                    density = Integer.parseInt(parsed[3]);              
                    city = new City(name,population,wage,density);              
                    cities[indexer][indexer2] = city;//Add to 2D Array.             
                    indexer2++;                             
                }
    
    
            } catch (IOException ioe) {
                // TODO Auto-generated catch block
                ioe.printStackTrace();
            }
    
    
    
        }
    
        public static void print2DArray(City[][] cities)
        {
            //row
            for(int i = 0; i < cities.length; i++)
            {
                //column
                for(int j = 0; j < cities[i].length;j++)
                {
                    City city = cities[i][j];
                    //used getters to print information.
                    System.out.printf("%s %d %d %d\n",city.getName(),
                            city.getPopulation(),city.getWage(),
                            city.getDensity());
                }
                System.out.println();
            }
        }
    }
    
    公共类城市领队{
    公共静态void main(字符串[]args)
    {
    城市[]城市=新城[2][10];
    readFileInto2D(“src/Cities.txt”,Cities);
    //用户提示他们想在这里做什么?
    打印阵列(城市);
    }
    公共静态void readFileInto2D(字符串文件名,城市[][]cities)
    {
    城市;
    字符串名称=”;
    整数总体=0;
    国际工资=0;
    int密度=0;
    试一试{
    扫描仪扫描=新扫描仪(新文件(文件名));
    弦线;
    
    public class CityReader {
    
    
        public static void main(String[] args)
        {
    
            City[][] cities = new City[2][10];
            readFileInto2D("src/Cities.txt",cities);
            //User prompt on what they want to here?    
            print2DArray(cities);
        }
    
        public static void readFileInto2D(String filename,City[][] cities)
        {
            City city;
            String name = "";
            int population = 0;
            int wage = 0;
            int density = 0;
    
            try {
    
                Scanner scan = new Scanner(new File(filename));
    
                String line;
                String[] parsed;
    
                //Read US:
                if(scan.hasNext())
                    line = scan.nextLine();
    
                //Keep track of rows
                int indexer = 0; 
                //Keep track of columns
                int indexer2 = 0;
    
                while(scan.hasNext())
                {
                    line = scan.nextLine();
    
                    if(line.contains("China"))
                    {
                        indexer += 1;//Go to next row
                        indexer2 = 0;//Start index at beginning of column.
                        line = scan.nextLine();//Read next line, ignore line with China.
                    }
                    parsed = line.split(", "); //This splits each line 
                                               //into an array of name,pop,wage,and density
                    name = parsed[0];
                    population = Integer.parseInt(parsed[1]);
                    wage = Integer.parseInt(parsed[2]);
                    density = Integer.parseInt(parsed[3]);              
                    city = new City(name,population,wage,density);              
                    cities[indexer][indexer2] = city;//Add to 2D Array.             
                    indexer2++;                             
                }
    
    
            } catch (IOException ioe) {
                // TODO Auto-generated catch block
                ioe.printStackTrace();
            }
    
    
    
        }
    
        public static void print2DArray(City[][] cities)
        {
            //row
            for(int i = 0; i < cities.length; i++)
            {
                //column
                for(int j = 0; j < cities[i].length;j++)
                {
                    City city = cities[i][j];
                    //used getters to print information.
                    System.out.printf("%s %d %d %d\n",city.getName(),
                            city.getPopulation(),city.getWage(),
                            city.getDensity());
                }
                System.out.println();
            }
        }
    }