天天看点

Java基础部分9

这是组合设计模式。

我有很多个(假设10万个)数据要保存起来,以后还需要从保存的这些数据中检索是否存在某个数据,(我想说出二叉树的好处,该怎么说呢?那就是说别人的缺点),假如存在数组中,那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,因为要从第1个依次往后取,取出来后进行比较。平衡二叉树(构建平衡二叉树需要先排序,我们这里就不作考虑了)可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多,原理如下图:

<a href="http://s3.51cto.com/wyfs02/M01/4B/EE/wKioL1Q1K23BgaUwAADpvekA47U748.jpg" target="_blank"></a>

代码如下:

package com.huawei.interview;

publicclass Node {

    publicintvalue;

    public Node left;

    public Node right;

    publicvoid store(int value)

    {

       if(value&lt;this.value)

       {

           if(left == null)

           {

              left = new Node();

              left.value=value;

           }

           else

              left.store(value);

       }

       elseif(value&gt;this.value)

           if(right == null)

              right = new Node();

              right.value=value;

              right.store(value);

           }         

    }

    publicboolean find(int value)

    {  

       System.out.println("happen" + this.value);

       if(value == this.value)

           returntrue;

           if(right == null) returnfalse;

           returnright.find(value);

       }else

           if(left == null) returnfalse;

           returnleft.find(value);

    public  void preList()

       System.out.print(this.value + ",");

       if(left!=null) left.preList();

       if(right!=null) right.preList();

    publicvoid middleList()

       if(right!=null) right.preList();      

    publicvoid afterList()

       System.out.print(this.value + ",");      

    }  

    publicstaticvoid main(String [] args)

       int [] data = newint[20];

       for(int i=0;i&lt;data.length;i++)

           data[i] = (int)(Math.random()*100) + 1;

           System.out.print(data[i] + ",");

       System.out.println();

       Node root = new Node();

       root.value = data[0];

       for(int i=1;i&lt;data.length;i++)

           root.store(data[i]);

       root.find(data[19]);

       root.preList();

       root.middleList();

       System.out.println();      

       root.afterList();

}

-----------------又一次临场写的代码---------------------------

import java.util.Arrays;

import java.util.Iterator;

public class Node {

    privateNode left;

    privateNode right;

    privateint value;

    //privateint num;

    publicNode(int value){

       this.value= value;

    publicvoid add(int value){

       if(value&gt; this.value)

           if(right!= null)

              right.add(value);

           else

              Nodenode = new Node(value);             

              right= node;

       else{

           if(left!= null)

              left.add(value);

              left= node;

    publicboolean find(int value){

       if(value== this.value) return true;

       elseif(value &gt; this.value){

           if(right== null) return false;

           elsereturn right.find(value);

       }else{

           if(left== null) return false;

           elsereturn left.find(value);         

    publicvoid display(){

       System.out.println(value);

       if(left!= null) left.display();

       if(right!= null) right.display();

    /*publicIterator iterator(){

    }*/

    publicstatic void main(String[] args){

       int[]values = new int[8];

       for(inti=0;i&lt;8;i++){

           intnum = (int)(Math.random() * 15);

           //System.out.println(num);

           //if(Arrays.binarySearch(values,num)&lt;0)

           if(!contains(values,num))

              values[i]= num;

              i--;

       System.out.println(Arrays.toString(values));

       Noderoot  = new Node(values[0]);

       for(inti=1;i&lt;values.length;i++){

           root.add(values[i]);

       System.out.println(root.find(13));

       root.display();

    publicstatic boolean contains(int [] arr, int value){

       inti = 0;

       for(;i&lt;arr.length;i++){

           if(arr[i]== value) return true;

       returnfalse;

1,张三,28

2,李四,35

3,张三,28

4,王五,35

5,张三,28

6,李四,35

7,赵六,28

8,田七,35

程序代码如下(答题要博得用人单位的喜欢,包名用该公司,面试前就提前查好该公司的网址,如果查不到,现场问也是可以的。还要加上实现思路的注释):

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.Comparator;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.TreeSet;

publicclass GetNameTest {

    /**

     *@paramargs

     */

    publicstaticvoid main(String[] args) {

       // TODO Auto-generatedmethod stub

       //InputStream ips =GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");

       //用上一行注释的代码和下一行的代码都可以,因为info.txt与GetNameTest类在同一包下面,所以,可以用下面的相对路径形式

       Map results = new HashMap();

       InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");

       BufferedReader in = new BufferedReader(new InputStreamReader(ips));

       String line = null;

       try {

           while((line=in.readLine())!=null)

              dealLine(line,results);

           sortResults(results);

       } catch (IOException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

    staticclass User

       public  String name;

       public Integer value;

       public User(String name,Integer value)

        {

           this.name = name;

           this.value = value;

       @Override

       publicboolean equals(Object obj) {

           // TODO Auto-generatedmethod stub

           //下面的代码没有执行,说明往treeset中增加数据时,不会使用到equals方法。

           boolean result = super.equals(obj);

           System.out.println(result);

           return result;

    privatestaticvoid sortResults(Map results) {

       TreeSet sortedResults = new TreeSet(

              new Comparator(){

                  publicint compare(Object o1, Object o2) {

                     // TODO Auto-generated methodstub

                     User user1 = (User)o1;

                     User user2 = (User)o2;

                     /*如果compareTo返回结果0,则认为两个对象相等,新的对象不会增加到集合中去

                      * 所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。

                      * */

                     //returnuser1.value-user2.value;

                     //returnuser1.value&lt;user2.value?-1:user1.value==user2.value?0:1;

                     if(user1.value&lt;user2.value)

                     {

                         return -1;

                     }elseif(user1.value&gt;user2.value)

                         return 1;

                     }else

                         return user1.name.compareTo(user2.name);

                     }

                  }

               }

       );

       Iterator iterator = results.keySet().iterator();

       while(iterator.hasNext())

           String name = (String)iterator.next();

           Integer value = (Integer)results.get(name);

           if(value &gt; 1)

           {            

              sortedResults.add(new User(name,value));            

           }

       printResults(sortedResults);

    privatestaticvoid printResults(TreeSet sortedResults)

       Iterator iterator  =sortedResults.iterator();

           User user = (User)iterator.next();

           System.out.println(user.name + ":" + user.value);

       }  

    publicstaticvoid dealLine(String line,Map map)

       if(!"".equals(line.trim()))

           String [] results = line.split(",");

           if(results.length == 3)

              String name = results[1];

              Integer value = (Integer)map.get(name);

              if(value == null) value = 0;

              map.put(name,value + 1);

本文转自  素颜猪  51CTO博客,原文链接:

http://blog.51cto.com/suyanzhu/1561393

上一篇: MongoDB结合PHP
下一篇: Java web部分11