本帖最后由 areyougay 于 2012-04-17 10:02:24 编辑

解决方案 »

  1.   

    好像明白LZ的意思了,把map信息转成一个2维数组import java.util.*;
    public class Test {
        public static void main(String[] args) throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("map01.txt")));
            String buf = "";
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            while ((buf=br.readLine()) != null) {
                if (! buf.matches("(\\d+(\\s+|$)){3,}")) continue;
                String[] sa = buf.split("\\s+");
                int x = Integer.valueOf(sa[0]);
                int y = Integer.valueOf(sa[1]);
                int z = Integer.valueOf(sa[2]);
                while (list.size() < y) {
                    list.add(new ArrayList<Integer>());
                }
                List<Integer> sub = list.get(y-1);
                while (sub.size() < x) {
                    sub.add(0);
                }
                sub.set(x-1, z);
            }        System.out.printf("     ");
            for (int i=0; i<12; i++) {
                System.out.printf("%02d ", i+1);
            }
            System.out.println();        for (int i=0; i<8; i++) {
                System.out.printf("%03d||", i+1);
                if (i<list.size()) {
                    List<Integer> sub = list.get(i);
                    for (int j : sub) {
                        if (j == 0) {
                            System.out.printf("   ");
                        } else {
                            System.out.printf("%02d ", j);
                        }
                    }
                }
                System.out.println();
            }
        }
    }
      

  2.   

    回复(阿宝):你写的是对的,我的横坐标大概是185,纵坐标是009,因为我只列了txt文件的几个数据,将map转换为二维数组有些位置(z轴)是没有值的,能否用.来代替空值,再将在控制台打印的信息写入另一个result.txt文档内中?
      

  3.   

    修改很简单啊,文件输出,最简单的方法就是输出重定向了,即调用
    java Test > result.txt
    这样就可以把控制台的信息输出到result文件了在代码中直接输出文件也很简单,用一个打印流打印到文件,即
    PrintStream ps = new PrintStream("result.txt");
    然后原来的代码的System.out的地方用ps来代替就可以了.代替空值就更简单了,在原来的代码的空值判断的地方,把打印空格改成打印.就可以了
    至于坐标,就是代码的循环的地方修改一下就可以了修改后代码
    import java.util.*;
    public class Test {
        public static void main(String[] args) throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("map01.txt")));
            PrintStream ps = new PrintStream("result.txt"); //用ps代替System.out就可以了
            String buf = "";
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            while ((buf=br.readLine()) != null) {
                if (! buf.matches("(\\d+(\\s+|$)){3,}")) continue;
                String[] sa = buf.split("\\s+");
                int x = Integer.valueOf(sa[0]);
                int y = Integer.valueOf(sa[1]);
                int z = Integer.valueOf(sa[2]);
                while (list.size() < y) {
                    list.add(new ArrayList<Integer>());
                }
                List<Integer> sub = list.get(y-1);
                while (sub.size() < x) {
                    sub.add(0);
                }
                sub.set(x-1, z);
            }        ps.printf("     "); //ps代替System.out
            for (int i=0; i<185; i++) { //改成最大x坐标为185
                ps.printf("%02d ", i+1); //ps代替System.out
            }
            ps.println(); //ps代替System.out        for (int i=0; i<9; i++) { //改成最大y坐标为9
                ps.printf("%03d||", i+1); //ps代替System.out
                if (i<list.size()) {
                    List<Integer> sub = list.get(i);
                    for (int j=0; j<185; j++) {//这里改成到185为止循环
                        if (j < sub.size()) { //如果有数组,则打印数据
                            ps.printf("%02d ", sub.get(j)); //ps代替System.out
                        } else { //没数据则打印空值
                            ps.printf(".  "); //用.代替空值,ps代替System.out
                            if (j > 99) {ps.print(" ");} //考虑到3位数以后的对齐,调整空格数
                        }
                    }
                }
                ps.println(); //ps代替System.out
            }
            br.close();
            ps.close(); //关闭文件
        }
    }
      

  4.   

    y坐标的输出有遗漏,重新修改一下
    import java.io.*;
    import java.util.*;
    public class Test {
        public static void main(String[] args) throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("map01.txt")));
            PrintStream ps = new PrintStream("result.txt"); //用ps代替System.out就可以了
            String buf = "";
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            while ((buf=br.readLine()) != null) {
                if (! buf.matches("(\\d+(\\s+|$)){3,}")) continue;
                String[] sa = buf.split("\\s+");
                int x = Integer.valueOf(sa[0]);
                int y = Integer.valueOf(sa[1]);
                int z = Integer.valueOf(sa[2]);
                while (list.size() < y) {
                    list.add(new ArrayList<Integer>());
                }
                List<Integer> sub = list.get(y-1);
                while (sub.size() < x) {
                    sub.add(0);
                }
                sub.set(x-1, z);
            }        ps.printf("     "); //ps代替System.out
            for (int i=0; i<185; i++) { //改成最大x坐标为185
                ps.printf("%02d ", i+1); //ps代替System.out
            }
            ps.println(); //ps代替System.out        for (int i=0; i<9; i++) { //改成最大y坐标为9
                ps.printf("%03d||", i+1); //ps代替System.out
                if (i<list.size()) {
                    List<Integer> sub = list.get(i);
                    for (int j=0; j<185; j++) {
                        if (j < sub.size()) {
                            ps.printf("%02d ", sub.get(j)); //ps代替System.out
                        } else {
                            ps.printf(".  "); //用.代替空值,ps代替System.out
                            if (j > 99) {ps.print(" ");}
                        }
                    }
                } else { //这里遗漏了,重新修改一下
                    for (int j=0; j<185; j++) {
                        ps.printf(".  "); //用.代替空值,ps代替System.out
                        if (j > 99) {ps.print(" ");}
                    }
                }
                ps.println(); //ps代替System.out
            }
            br.close();
            ps.close(); //关闭文件
        }
    }
      

  5.   

    代码都写到这程度了,只是显示的问题,LZ难道连这么简单的处理都不会?
    LZ你也太依赖别人了吧,要学会自己动手才能长进啊import java.util.*;
    import java.io.*;
    public class Test {
        public static void main(String[] args) throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("map01.txt")));
            PrintStream ps = new PrintStream("result.txt"); 
            String buf = "";
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            while ((buf=br.readLine()) != null) {
                if (! buf.matches("(\\d+(\\s+|$)){3,}")) continue;
                String[] sa = buf.split("\\s+");
                int x = Integer.valueOf(sa[0]);
                int y = Integer.valueOf(sa[1]);
                int z = Integer.valueOf(sa[2]);
                while (list.size() < y) {
                    list.add(new ArrayList<Integer>());
                }
                List<Integer> sub = list.get(y-1);
                while (sub.size() < x) {
                    sub.add(0);
                }
                sub.set(x-1, z);
            }        ps.printf("     "); 
            for (int i=0; i<185; i++) { 
                ps.printf("%02d ", i+1); 
            }
            ps.println();         for (int i=0; i<9; i++) { 
                ps.printf("%03d||", i+1); 
                if (i<list.size()) {
                    List<Integer> sub = list.get(i);
                    for (int j=0; j<185; j++) {
                        if (j < sub.size()) {
                            ps.printf("%02d ", sub.get(j)); 
                        } else {
                            ps.print("000. ".substring((j+1>99 ? 1 : 2))); //修改这里就可以
                        }
                    }
                } else {
                    for (int j=0; j<185; j++) {
                        ps.print("000. ".substring((j+1>99 ? 1 : 2))); //修改这里就可以了
                    }
                }
                ps.println(); 
            }
            br.close();
            ps.close(); 
        }
    }
      

  6.   

    if (!buf.matches("(\\d+(\\s+|$)){3,}")) continue;
    这什么意思 ? matches 里面的
      

  7.   

    这是正则表达式判断是不是 数字+空格(出现3次以上)这样的字符串\\d 表示数字
    + 表示出现一次或多次
    \\s是空白符号(也就是空格符,tab符,换行符等等)
    $ 表示字符串结束符号
    {3,} 表示出现3次以上这样可以保证文件有非法数据的时候不出现异常而继续执行