细节之重——Java编程小感悟

最近在研究共词分析。看了不少算法,于是自习跃跃欲试,想用学了没多久的java进行实践。经过自认为周密的计划,我兴奋地开始实践,不想出师未捷,第一小步就遇到了找不出的错误。

第一步,我想实现,读入一个文本,统计其中不同词的出现次数。这样的程序并不难,我一鼓作气写了出来:

import java.io.*;
import java.util.*;
public class cotest {
        public static void main(String args[]){
                File readFile=new File("F:/code/coword.txt"),
                writeFile= new File("F:/code/hello.txt");
                try{
                        FileReader inOne=new FileReader(readFile);
                        BufferedReader inTwo=new BufferedReader(inOne);
                        String s=null;
                        int n;
                        LinkedList<str_nu> words=new LinkedList<str_nu>();
                        while((s=inTwo.readLine())!=null){
                                Scanner sc=new Scanner(s);
                                while(sc.hasNext()){
                                        String a=new String();
                                        a=sc.next();
                                        //System.out.println(a);
                                                n=getIndex(words,a);
                                                //System.out.println(n);
                                                if(n!=-1){
                                                        words.get(n).num++;
                                                        System.out.println(words.get(n).num);
                                                }
                                                else{
                                                        str_nu new_word=new str_nu();
                                                        new_word.word=a;
                                                        new_word.num=1;
                                                        words.add(new_word);
                                                }
                                                        
                                        
                                }
                        }
                        for(int i=0;i<words.size();i++){
                                System.out.println(words.get(i).word+" "+words.get(i).num);
                        }
                        inOne.close();
                        inTwo.close();
                        
                }
                catch(IOException e){
                        System.out.println(e);
                }
                
        }

        private static int getIndex(LinkedList<str_nu> words, String a) {
                // TODO Auto-generated method stub
                for(int i=0;i<words.size();i++){
                        if(words.get(i).word==a){
                                System.out.println(i);
                                return i;
                        }
                }

                return -1;
        }
}


class str_nu{
        String word=new String();
        int num=0;
}
刚写出来的时候还挺得意,但实验结果却让我傻了眼:程序根本不能统计词语的出现次数,只能把词语一个个打出来。我百思不得其解,怎么调试都还是这样的结果。我高涨的热情也在一次次调试的过程中,消耗殆尽了。

然后我就开始了花式询问,在小木虫、CSDN、百度知道上提问,还特意找了一个学软件的同学,让他帮忙调试。

状况如下:

小木虫:悬赏20,一人回复,不过他的java水平好像还不如我,没回答到点子上。‘

百度知道:悬赏20,没人回答。

同学:建议我用HashMap重新编写,并给出了他的程序。他是站在比我高很多的层次上,他写的代码,我只能勉强看懂。运行结果其实也不是我想要的。他的解释是,我的代码有问题,每次num都会被重置为0。但是我又仔细检查好几遍之后不敢苟同。

CSDN:没有悬赏(因为没钱),一人回复,终于解决了我的问题。

字符串的精确比较不能用==,要用.equals()!


字符串的精确比较不能用==,要用.equals()!


字符串的精确比较不能用==,要用.equals()!


然后代码变成了这样:

import java.io.*;
import java.util.*;
public class coword {
        public static void main(String args[]){
                File readFile=new File("F:/code/coword.txt"),
                writeFile= new File("F:/code/hello.txt");
                try{
                        FileReader inOne=new FileReader(readFile);
                        BufferedReader inTwo=new BufferedReader(inOne);
                        String s=null;
                        int n;
                        LinkedList<str_nu> words=new LinkedList<str_nu>();
                        while((s=inTwo.readLine())!=null){
                                Scanner sc=new Scanner(s);
                                while(sc.hasNext()){
                                        String a=new String();
                                        a=sc.next();
                                        //System.out.println(a);
                                                n=getIndex(words,a);
                                                //System.out.println(n);
                                                if(n!=-1){
                                                        words.get(n).num++;
                                                }
                                               else{
                                                        str_nu new_word=new str_nu();
                                                        new_word.word=a;
                                                        new_word.num=1;
                                                        words.add(new_word);
                                                }
                                                        
                                        
                                }
                        }
                        for(int i=0;i<words.size();i++){
                                System.out.println(words.get(i).word+" "+words.get(i).num);
                        }
                        inOne.close();
                        inTwo.close();
                        
                }
                catch(IOException e){
                        System.out.println(e);
                }
                
        }

        private static int getIndex(LinkedList<str_nu> words, String a) {
                // TODO Auto-generated method stub
                for(int i=0;i<words.size();i++){
                        if(words.get(i).word.equals(a)){
                               
                                return i;
                        }
                }

                return -1;
        }
}


class str_nu{
        String word=new String();
        int num;
}

然后结果就对了!!!


从这件事中我有两点收获:

第一,不要在学了一点点知识之后就盲目上手,知识是需要积累的,兔子只知道吃地上的草,而长颈鹿却能看到树上的叶子。

第二,细节虽然不能决定你的成功,但往往决定你的失败。equals这个问题,其实之前我也见过,但当时认为自己肯定与java无缘,就没有用心去记。所以,不要太功利地区学习,要时刻保持对周围的好奇心。

好了就是这样。我相信经常生产鸡汤能使人心情愉悦。快到周末了,希望自己能好好利用时间吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值