功能:对帐功能
 
     同时给你俩txt文档:BankAcount.txt和ClientAcount.txt,两份文档的内容如下:BankAcount.txt
日期:2007-05-30 总交费笔数:3 总金额:9000.00
银行交易流水帐号(GSYH000) 用户交费合同号(ConP00)  金额(2000.00元)
银行交易流水帐号(GSYH001) 用户交费合同号(ConP01)  金额(3000.00元)
银行交易流水帐号(GSYH002) 用户交费合同号(ConP02)  金额(4000.00元)
日期:2007-05-31 总交费笔数:4 总金额:14000.00
银行交易流水帐号(GSYH003) 用户交费合同号(ConP03)  金额(2000.00元)
银行交易流水帐号(GSYH004) 用户交费合同号(ConP04)  金额(3000.00元)
银行交易流水帐号(GSYH005) 用户交费合同号(ConP05)  金额(4000.00元)
银行交易流水帐号(GSYH006) 用户交费合同号(ConP06)  金额(5000.00元)
日期:2007-06-01 总交费笔数:5 总金额:20000.00
银行交易流水帐号(GSYH007) 用户交费合同号(ConP07)  金额(2000.00元)
银行交易流水帐号(GSYH008) 用户交费合同号(ConP08)  金额(3000.00元)
银行交易流水帐号(GSYH009) 用户交费合同号(ConP09)  金额(4000.00元)
银行交易流水帐号(GSYH010) 用户交费合同号(ConP10)  金额(5000.00元)
银行交易流水帐号(GSYH011) 用户交费合同号(ConP11)  金额(6000.00元)
ClientAcount.txt:
银行交易流水帐号(GSYH000) 用户交费合同号(ConP00)  金额(2000.00元) 日期:2007-05-30  
银行交易流水帐号(GSYH001) 用户交费合同号(ConP01)  金额(3000.00元) 日期:2007-05-30 
银行交易流水帐号(GSYH006) 用户交费合同号(ConP06)  金额(5000.00元) 日期:2007-05-30 
银行交易流水帐号(GSYH003) 用户交费合同号(ConP03)  金额(2000.00元) 日期:2007-05-31
银行交易流水帐号(GSYH004) 用户交费合同号(ConP04)  金额(3000.00元) 日期:2007-05-31
银行交易流水帐号(GSYH005) 用户交费合同号(ConP12)  金额(4000.00元) 日期:2007-05-31
银行交易流水帐号(GSYH007) 用户交费合同号(ConP07)  金额(2000.00元) 日期:2007-06-01
银行交易流水帐号(GSYH008) 用户交费合同号(ConP08)  金额(5000.00元) 日期:2007-06-01
银行交易流水帐号(GSYH009) 用户交费合同号(ConP09)  金额(4000.00元) 日期:2007-06-01
银行交易流水帐号(GSYH010) 用户交费合同号(ConP10)  金额(5000.00元) 日期:2007-06-01
银行交易流水帐号(GSYH011) 用户交费合同号(ConP11)  金额(8000.00元) 日期:2007-06-01现要求对俩文档比对后生成一个新的文件,文件中包含所有对不上的条目。生成的新文件格式为:银行代码,日期,check failed
                  错误代码  银行记帐流水号  金额错误代码包括:
本条交易日期与清算日不符
本条交易客户端不存在
客户端多出的交易
交易金额不符
计费查询出错

解决方案 »

  1.   

    用I/O可以实现的文件的读取以及按空格进行分段,
    想用Map对分段后的字段进行对象的保存,关键是保存的比较与匹配感觉实现起来的难度比较大,
    大伙帮帮忙吧,这算法我是真没办法自己设计出来!刚毕业,进公司一个多月了,说是对我们新进员工的考察以决定是否录用,不是时间紧迫我也不会把问题抛给大家的。。谢过了!
      

  2.   

    关于BankAcount.txt的读取以及分段的代码如下,可以在main()方法中同样引入对ClientAcount.txt的分段读取,怎样进行匹配,怎样进行比较,大家提点意见好吗。。import java.io.*;   
      
    public class ReadTxt
    {
    public static void main(String[] args) 
    {
    try
     {
    int nLineCount = 0;//行数
    File file = new File("BankAcount.txt");
    BufferedReader in = new BufferedReader(new FileReader(file));
    String strLine = "";
    StringBuffer strBuffer = new StringBuffer(1000);
    while ((strLine = in.readLine()) != null) 
    {
    strBuffer.append(strLine);
    strBuffer.append("^^");
    ++nLineCount;
    }
    //最终结果保存在strResult中,第一行在strResult[0],第一行第一列在strResult[0][0]
    String[][] strResult = new String[nLineCount][];
    String[] strTemp = (strBuffer.toString()).split("\\^\\^");
    for (int i = 0; i<strTemp.length ; ++i)
    for (int j = 0 ; j<strTemp[i].length() ; ++j)
    {
    strResult[i] = strTemp[i].split(" ");
    }
    for (int i=0 ; i<strResult.length ; ++i)
    for (int j=0 ; j<strResult[i].length ; ++j)
    {
    strResult[i][j] = strResult[i][j].replaceAll("\"","");
    System.out.println(strResult[i][j]);
    }
    } catch (Exception e) {e.printStackTrace();}
    }
    }
      

  3.   

    import java.io.IOException;
    public class Balancer {
    private java.util.Map bankMap;
    private java.util.Map clientMap;
    public Balancer()
    {
    bankMap=new java.util.HashMap();
    clientMap=new java.util.HashMap();
    }
    /**
     * 解析文件,是每条记录都形成一个Record对象存入map
     * @param bankFile bankAccount.txt完整路径
     * @param clientFile clientAccount.txt完整路径
     * @throws IOException 
     */
    public void parseFile(String bankFile,String clientFile) throws IOException
    {
    java.io.BufferedReader bankReader=new java.io.BufferedReader(new java.io.FileReader(bankFile));
    String line=bankReader.readLine();
    String d="";
    while(line!=null)
    {
    String[] fields=line.split(" ");
    if(fields[0].indexOf("日期")!=-1)
    d=fields[0];
    else
    {
    bankMap.put(fields[0], new SingleRecord(fields[0],fields[1],fields[2],d));
    }
    line=bankReader.readLine();
    }
    bankReader.close();
    java.io.BufferedReader clientReader=new java.io.BufferedReader(new java.io.FileReader(bankFile));
    line=clientReader.readLine();
    while(line!=null)
    {
    String[] fields=line.split(" ");
    clientMap.put(fields[0], new SingleRecord(fields[0],fields[1],fields[2],fields[3]));
    line=clientReader.readLine();
    }
    clientReader.close();
    }
    /**
     * 比较两个map,在clientMap中依次取出每条key-record对,判断改key在bankMap中是否存在对应的record,
     * 如果存在,判断这两个record是否相等,相等则从两个map中删除,如果不相等:判断哪些field不等,并形成相应的message写入到文件中
     * 最后分别检查bankMap、clientMap中是否还有key-value对,如果有,形成相应的message写入到文件
     *
     */
    public void compare()
    {

    }
    public static void main(String[] args)throws Exception
    {
    Balancer b=new Balancer();
    b.parseFile("d://BankAcount.txt", "d://ClientAcount.txt");
    }
    }
    class SingleRecord {
    private String id;// 银行交易流水帐号 private String pactID;// 用户交费合同号 private String money;// 金额,可以设置成数组类型,这里简化 private String date;// 交易日期 public SingleRecord(String id,String pactID,String money,String date)
    {
    this.id=id;
    this.pactID=pactID;
    this.money=money;
    this.date=date;
    }
    public String getDate() {
    return date;
    } public void setDate(String date) {
    this.date = date;
    } public String getId() {
    return id;
    } public void setId(String id) {
    this.id = id;
    } public String getMoney() {
    return money;
    } public void setMoney(String money) {
    this.money = money;
    } public String getPactID() {
    return pactID;
    } public void setPactID(String pactID) {
    this.pactID = pactID;
    } public boolean equals(Object obj) {
    if (obj instanceof SingleRecord) {
    SingleRecord r = (SingleRecord) obj;
    if ((id.equals(r.getId())) && (pactID.equals(r.getPactID()))
    && (money.equals(r.getMoney()))
    && (date.equals(r.getDate())))
    return true;
    }
    return false;
    }
    }没有完全实现,剩下的自己写
      

  4.   

    public void compare() {
    java.util.Set clientKeySet = clientMap.keySet();
    java.util.Iterator i = clientKeySet.iterator();
    // 寰幆clientMap锛屽姣忔潯璁板綍杩涜鍒ゆ柇
    while (i.hasNext()) {
    String key = (String) i.next();
    SingleRecord clientRecord = (SingleRecord) clientMap.get(key);// clientMap涓殑key瀵瑰簲鐨勮褰?
    SingleRecord bankRecord = (SingleRecord) bankMap.get(key);// bankMap涓殑key瀵瑰簲鐨勮褰?
    if (clientRecord.equals(bankRecord))// 涓ゆ潯璁板綍鐩哥瓑
    {
    clientMap.remove(key);
    bankMap.remove(key);
    } else if ((clientRecord != null) && (bankRecord != null))// clientMap銆乥ankMap涓垎鍒瓨鍦ㄨ鏉¤褰曪紝浣嗘槸璁板綍鍐呭涓嶄竴鏍?
    {
    // 鍒嗗埆鍒ゆ柇涓ゆ潯璁板綍鐨勫悇涓瓧娈?
    if (!clientRecord.getPactID().equals(bankRecord.getPactID()))// 鐢ㄦ埛浜よ垂鍚堝悓鍙蜂笉涓€鑷达紝褰㈡垚璁板綍鍐欏叆鏂囦欢
    { }
    if (!clientRecord.getMoney().equals(bankRecord.getMoney()))// 閲戦涓嶄竴鑷达紝褰㈡垚璁板綍鍐欏叆鏂囦欢
    { }
    if (!clientRecord.getDate().equals(bankRecord.getDate()))// 鏃ユ湡涓嶄竴鑷达紝褰㈡垚璁板綍鍐欏叆鏂囦欢
    { }
    clientMap.remove(key);
    bankMap.remove(key);
    }
    }
    //寰幆bankMap涓墿涓嬬殑璁板綍锛屽氨鏄痓ankMap涓瓨鍦紝鑰宑lientMap涓嶅瓨鍦ㄧ殑璁板綍
    java.util.Set bankKeySet=bankMap.keySet();
    i=bankKeySet.iterator();
    while(i.hasNext())
    {
    SingleRecord r=(SingleRecord)i.next();
    //鍐欐枃浠?
    }
    //寰幆clientMap涓墿涓嬬殑璁板綍锛屽氨鏄痗lientMap涓瓨鍦紝鑰宐ankMap涓嶅瓨鍦ㄧ殑璁板綍
    clientKeySet=clientMap.keySet();
    i=clientKeySet.iterator();
    while(i.hasNext())
    {
    SingleRecord r=(SingleRecord)i.next();
    //鍐欐枃浠?
    }
    }