码迷,mamicode.com
首页 > 其他好文 > 详细

aaa

时间:2016-03-13 08:55:41      阅读:369      评论:0      收藏:0      [点我收藏+]

标签:

aaa

package com.itheima;

/*    需求:    
 *         1、取出一个字符串中字母出现的次数。
 *         如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)...
 *  思路:
 *      从输出结果来看,对字符串各字符进行了排序且建立了映射关系。
 *      所以用TreeMap集合来存储字符串的所有字符.
 *      首先将字符串转换为字符数组,并根据算法条件判定写入TreeMap集合中。这一步可以封装为stringToMap方法。
 *         然后,将TreeMap集合按规定格式转换为字符串并返回,这一步封装为mapToString方法。
 *         将这两个方法综合起来则构成了总的方法即stringSort方法,返回格式要求的字符串。
 *         打印。
 */
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class Test1 {

    public static void main(String[] args) {
        
        
        String s = "wojiaofanjiananhahaha";
        System.out.println(sortString(s));
    }
    
    public static String sortString(String s) {  //sortString方法,调用以下两个方法。
        
        
        return mapToString(stringToMap(s));
        
        
        
        
    }
    //stringToMap方法是将字符串中的字符按照TreeMap<a,3>的格式写入Map集合并返回。
    public static TreeMap stringToMap (String s){
        
        TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
        
        char[] ch = s.toCharArray();   //将字符串转换为字符数组
                            
        
        for(char i : ch) {               //遍历字符数组,高级for循环
            
            if(!tm.containsKey(i))    //如果Map集合中没有字符i键,则初始化Map值为1。否则值+1
                tm.put(i, 1);
                
            else{
                tm.put(i,tm.get(i)+1);  
            }
            
        }
        return tm;          
    }
    
    //该方法把的集合元素取出,转换为规定格式字符串
    public static String mapToString(TreeMap tm) {
        
        
        //Set集合存储Map元素的映射关系
        Set<Map.Entry<Character, Integer>> set = tm.entrySet();  
        
        StringBuilder sb = new StringBuilder();
        //遍历Set集合
        for(Iterator<Map.Entry<Character,Integer>> it = set.iterator();it.hasNext();) {
            
            //利用Map.Entry的getKey()和getValue()方法取出键和值
            Map.Entry<Character, Integer>  me = it.next();
            sb.append(me.getKey()+"("+me.getValue()+")");
            
        }
        //利用容器StringBuilder转换为字符串
        String s2 =sb.toString();
        
        return s2;
    }

}
package com.itheima;

/* 需求:
 *         10、28人买可乐喝,
 *         3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,
 *         够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
 * 
 * 思路:  
 *         流程分析:瓶盖可以换可乐,可乐的瓶盖加上没有换的瓶盖又可以换可乐,循环来进行。
 *            这个循环流程中有以下变量:
 *         colacap:瓶盖的数量  colaswap :瓶盖换取可乐后的数量  swaptotal 总共换取可乐的数量
 *         
 * 
 * 答案: 买34瓶可乐,可以供50个刃喝
 *                买19瓶可乐,够28个刃喝。
 */
public class Test10 {

    public static void main(String[] args) {
        
        
        
        
        System.out.println(firstBuy(28));
        System.out.println(firstBuy(50));
        
        
        
    
}    
    
    //此方法用于得到够N个人喝,需要购买的可乐数量。
    public static int firstBuy(int n) {
        
        int colacap = 0;
        while(colacap + buyToSwap(colacap) != n ) { //条件判定,购买的可乐加上换取的可乐不等于总人数,则继续循环
            
            colacap++;
        }
        
        
        return colacap;  //返回最初购买的可乐数
        
    }
    //此方法用于计算够买n瓶可乐,可以换取可乐的总数。,
    public static int buyToSwap (int colacap){
        
        int colaswap  = colacap / 3;;  //瓶盖/3 为一次可以换取可乐的数量
        int swaptotal = colaswap;       //换取的总数量
        
        while(colacap > 3 ) {     //循环
            
            
            colacap = colaswap +colacap % 3;  //换取可乐后剩下的瓶盖总量
            colaswap = colacap / 3;            // 瓶盖又可以换取可乐
            swaptotal = swaptotal+ colaswap; //换取可乐的总数
            
            
            
            
            
            
        }
        return swaptotal;  //返回n个瓶盖换取可乐的总数
        
        
        
    }

}
package com.itheima;

/*需求:
 *         一个ArrayList对象aList中存有若干个字符串元素,
 *         现欲遍历该ArrayList对象,
 *         删除其中所有值为"abc"的字符串元素,请用代码实现。
 *思路:
 *           删除ArrayList中的元素有一个问题,就是如果调用List本身的删除方法,
 *           删除元素集合长度变化引起索引变化,会影响遍历。
 *           可以通过Iterator遍历并使用Iterator的remove()方法实现删除元素
 * 
 */
import java.util.ArrayList;
import java.util.Iterator;

public class Test2 {
    public static void main(String[] args) {
        
        ArrayList<String> alist = new ArrayList<String>();
        
        alist.add("hello");
        alist.add("world");
        alist.add("abc");
        alist.add("heima");
        alist.add("programer");
        alist.add("abc");
        
        System.out.println(alist);  //打印原集合
        
        removeElements(alist,"abc"); //调用删除指定元素方法。
        
        System.out.println(alist);    //打印删除元素后的集合,做对比
        
        
        
        
    }
    
    /*此方法按照需求删除指定元素,并返回一个集合*/
    public static ArrayList<String> removeElements(ArrayList alist,String s) {
        
        
        Iterator<String> it = alist.iterator();  //规定迭代器中只存储字符串元素
        while(it.hasNext()) {                    //遍历集合
            
            String s1 = it.next();
        
            if(s1.equals(s))
                it.remove();  //调用迭代器本身的remove方法删除元素
            
        }
        
        return alist;
    }

}
package com.itheima;

/*需求: 
 *         编写一个类,在main方法中定义一个Map对象(采用泛型),
 *         加入若干个对象,然后遍历并打印出各元素的key和value。
 * 思路
 *         用HashMap存储Key和Value,键为Heimaer类,值为String
 *         由于是HashMap则应该重写类中的hashCode()和equals方法
 *         建立Map.Entry作为元素的映射关系集合
 *         遍历集合调用.getKey()和.getValue()方法获取键值并打印。
 */
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Test3 {

    public static void main(String[] args) {
        
        HashMap<Heimaer,String> hm = new HashMap<Heimaer,String>();
        
        //添加Map集合元素
        hm.put(new Heimaer(1,"fanjianan"),"Andriod");
        hm.put(new Heimaer(2,"joyce"),"Andriod");
        hm.put(new Heimaer(3,"lennon"),"Andriod");
        hm.put(new Heimaer(4,"jobs"),"IOS");
        hm.put(new Heimaer(5,"gates"),"C++");
        
        //调用printMap方法打印集合元素
        printMap(hm);
        
    }
    
    /*此方法用于打印集合元素*/
    public static void printMap(HashMap hm) {
        //Set集合存放映射关系Map.Entry
        Set<Map.Entry<Heimaer,String>> s = hm.entrySet();
        Iterator<Map.Entry<Heimaer,String>> it = s.iterator();
        //迭代器遍历Set集合获取Map.Entry元素
        while(it.hasNext()) {
            
            Map.Entry<Heimaer,String> me = it.next();
            //打印键值
            System.out.println("Student:.."+me.getKey()+"\tMajoy:..."+me.getValue());
        }
        
    }

}

/*此类为自定义类,描述黑马学员,作为Map集合的键*/
class Heimaer {
    
    private int id;
    private String name;
    
    Heimaer(int id ,String name) {
        this.id = id;
        this.name = name;
    }
    //重写hashCode()方法
    public int hashCode() {  
        
        return this.id+100;
    }
    //重写equals()方法
    public boolean equals(Object obj) {  
        
        if(!(obj instanceof Heimaer)) {
            new RuntimeException("无法比较不同类型");
            return false;
        }
        
        Heimaer h2 = (Heimaer)obj;
        return (this.id == h2.id) && (this.name.equals(h2.name));    
        
    }
    //重写toString方法
    public String toString() {
        
        return this.id +"---"+ this.name;
    }
    
    public String getName() {
        return this.name;
    }
    public int getID() {
        return this.id;
    }
    public void setName() {
        this.name = name;
    }
    public void setID(int id) {
        this.id = id;
    }
    
    
}
package com.itheima;

/*题目:
 *        分析运行结果,说明原理。(没有分析结果不得分) 
 *答: 
 *    程序结果为  102
 *           102
 *           102
 *     分析:我们可以从程序中看出,只new出一个Data类的对象,
 *         因此ArrayList中存放的3个元素都是一样的,都是指向data的引用。
 *         循环中data.val = i 则改变了这个对象的成员变量val.
 *         因此无论循环多少次,这个对象中的val的值,都是最后一次循环i赋予的值。
 *         因此打印的结果都是这个对象的val,都是102.
 */
import java.util.ArrayList;

class Data {

   int val;

}

public class Test4 {

    public static void main(String args[]) {
        Data data = new Data();        //注意:此处仅仅只new了一个对象
        ArrayList<Data> list = new ArrayList<Data>();
    
        for (int i = 100; i < 103; i++) {
            data.val = i;    //改变该data对象的值为i
            list.add(data);  //把该对象的引用作为元素加入集合,集合中加入的都是同一个对象
        }
    
        for (Data d : list) {
            System.out.println(d.val);  //d.val的值是一样的,因为是同一个对象的值值未最后一次循环赋予的值,102
        }
    }
}
package com.itheima;

/* 需求:
 *         把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。
        61.54.231.245
        61.54.231.9
        61.54.231.246
        61.54.231.48
        61.53.231.249
 * 思路:      
 *         首先建立流对象BufferedReader读取ip.txt文件,循环获取每一行字符串。
 *         获取一行字符串后,用正则表达式把ip地址的所有分段变成3位数,高位补0.
 *         将转换后的字符串加入TreeSet集合中,自动排序
 *         遍历TreeSet集合,将每一个字符串元素用正则表达式还原后打印。
 * 
 */

import java.io.*;
import java.util.Iterator;
import java.util.TreeSet;
public class Test5 {

    public static void main(String[] args) {
        
        
        File f = new File("F:\\ip.txt");    //创建File对象,关联ip地址文件
        TreeSet<String> ts = fileIPtoSet(f); //调用方法,将文件内的ip地址格式转换后存入集合ts
        printSetIP(ts);                        //按原格式打印排序后的ip地址
        
        
        
        
                    
    }
    /*此方法将ip.txt的所有ip地址转换为XXX.XXX.XXX.XXX格式,并放入TreeSet集合中排序,返回该集合*/
    public static TreeSet<String> fileIPtoSet(File f) {
        
        TreeSet<String> ts = new TreeSet<String>();
        String line = null;
        String ip = null;
        
        try {
            
            BufferedReader br = new BufferedReader(new FileReader(f));
            while((line = br.readLine()) != null) {
                
                ip = line.replaceAll("(\\d+)","00$1");  //将所有ip段高位补两个0,
                ip = ip.replaceAll("0+(\\d{3})", "$1"); //去掉多余的0,保留3位
                //System.out.println(ip);
                ts.add(ip);                                //将统一格式的ip放入TreeSet集合中排序
            }
            
            br.close();
        } 
        
        catch (IOException e) {
            new RuntimeException("读入文件失败");
        }
        
        
        return ts;
    }
    
    
    /*此方法将集合中的所有ip转换成原格式并打印*/
    public static void printSetIP (TreeSet ts) {

        Iterator<String> it = ts.iterator();  //遍历Set集合
        String line = null;
        while(it.hasNext()) {
            line = it.next();
            
            line = line.replaceAll("0+([1-9]+)", "$1"); //去掉ip段的高位0
            System.out.println(line);                     //打印集合元素
        }

    }
}
package com.itheima;

/*需求:
 *         编写程序,生成5个1至10之间的随机整数,
 *         存入一个List集合,编写方法对List集合进行排序
 *         (自定义排序算法,禁用Collections.sort方法和TreeSet),然后遍历集合输出。
 * 思路:
 *         1。调用Random类的实例获取随机数,自动装箱为Integer类型加入ArrayList中。
 *         2.对ArrayList中的元素进行排序。两种思路:可以将ArrayList转换为数组,也可以直接对元素进行compareTo比较
 *                本程序用的是对象比较方法,目的是提高程序的扩展性。
 *         3.打印ArrayList中的元素。
 * 
 */
import java.awt.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

public class Test6 {

    public static void main(String[] args) {
        
        ArrayList<Integer> list =new ArrayList<Integer>();  //创建集合对象
        
        //创建Randowm对象,循环5次,调用nextInt(10)+1获取1-10的随机数
        Random r = new Random();  
        for(int i = 0;i<5;i++) {
            list.add(r.nextInt(10) + 1 );
            //System.out.println(list.get(i));
        }
        
        //打印集合
        printArrayList(list);
        //调用arrayListSort方法对集合排序
        arrayListSort(list);
        printArrayList(list);
    
        
        
    }
    //此方法是集合排序方法,运用了冒泡排序方法。
    public static ArrayList arrayListSort(ArrayList<Integer> list) {
        
        Integer temp;
        
        //冒泡排序算法,双重循环,利用对象的compareTo方法比较相邻元素的大小
        for(int i = 0;i<list.size() - 1;i++) {
            for(int j = 0 ;j<list.size() - i -1;j++) {
                if(list.get(j).compareTo(list.get(j+1)) > 0) {
                    
                    //相邻元素互换。
                    temp = list.get(j);
                    list.set(j, list.get(j+1));
                    list.set(j+1, temp);
                    
                }
                
            }
        }
        return list;
        
    }
    
    //此方法用于打印集合中的元素
    public static void printArrayList(ArrayList list) {
        
        //Iterator迭代器遍历集合,打印元素,形式为[元素]
        Iterator it = list.iterator();
        while(it.hasNext()) {
            
            System.out.print("["+it.next()+"]"+"\t");
        }
        System.out.println();
    }

}
package com.itheima;
/*客户端思路:
 *         1.创建Socket对象,指定ServerIP地址和端口。
 *         2.调用s.getInputStream/OutputStream获取网络IO流对象
 *         3.创建本地流对象关联目标文件。
 *         4.调用本地流对象的read()方法读取数据,并写入网络的输出流中。
 *         5.等待服务器返回信息。 
 */



import java.io.*;
import java.net.*;
public class Test7Client {

    public static void main(String[] args) {
        
        File f = new File("F:\\abc.jpg");
        try {
            
            //指定Server IP地址和端口号
            Socket s = new Socket("192.168.1.101",10003);
            
            //本地输入流,用于读取目标文件
            FileInputStream localis = new FileInputStream(f);
            
            //网络输入输出流
            OutputStream os = s.getOutputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            
            //读取本地文件并写入网络输出流
            byte[] temp = new byte[1024*1024];
            int len = 0;
            while((len = localis.read(temp))!= -1) {
                
                os.write(temp,0,len);
                
            }
            
            //标记,传输完成
            s.shutdownOutput();
            //打印服务器返回信息
            System.out.println(br.readLine());
            s.close();
            
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            new RuntimeException("上传失败!");
        }

    }

}
package com.itheima;

/*需求:
 *         使用TCP协议写一个可以上传文件的服务器和客户端。
 *思路:
 *        Server端:1.创建ServerSocket对象,指定Server端口。
 *                2.一个服务器应该可以多个客户端同时访问,故应用多线程技术。
 *                3.创建Upload类实现Runnable接口。定义线程。
 *                4.重写run方法。run方法中实现和Client端的IO通信。
 *                5.程序以上传F盘符下的abc.jpg为例。
 *            
 * 
 * 
 */
import java.net.*;
import java.io.*;


public class Test7Server {
    public static void main(String[] args) throws Exception {
        
        
        ServerSocket ss = new ServerSocket(10003);
        //服务器监听机制,一旦获取Client的Socket则开启线程、
        while(true) {
            
            new Thread(new Upload(ss.accept())).start();
            
        }
        
        
        
    }
}

class Upload implements Runnable {  //线程Upload实现上传功能
    
    
    private Socket s;
    
    Upload(Socket s) {
        this.s = s;
    }
    public void run() {
        
        try {
                
                //网络IO流对象,用于和Client端进行通信
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                InputStream is = s.getInputStream();
                
                File f = new File("F:\\abc.jpg"); //创建文件
                int count = 0;
                while(f.exists()) {  //重复改名
                    f = new File("F:\\abc("+(++count) +").jpg");
                }
                
                //Server本地输出流。用于创建本地文件
                FileOutputStream os = new FileOutputStream(f);
                
                //字节数组缓冲区
                byte[] temp = new byte[1024*1024];
                int len;
                
                //循环写入文件
                while((len = is.read(temp)) != -1) {
                    
                    os.write(temp,0,len);
                }
                
                
                
                String ip = s.getInetAddress().getHostAddress();   //获取客户端ip地址
                bw.write(new String("ip:...."+ip+ "Upload Down")); //上传成功后返回上传信息
                bw.flush();
                bw.close();
                
                os.close();
                s.close();
                
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        
    }
}
package com.itheima;
/*需求:
 *         写一方法,打印等长的二维数组,
 *         要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 
 *         如: n = 4 则打印:
 *思路:      由题目可知,需要螺旋式打印一个二维数组,
 *        我们用递归的思想,把这个数组分圈打印,由外到内的打印。
 *        而每一圈有四种情况,上右下左。
 *        根据上述特点找出数据间的关系。

 * 
 */

public class Test8 {

    public static void main(String[] args) {
          
                arraynum(6);  
    }  
      
    //便于改代码..输入不同y值输出不同的二维数列  
    public static void arraynum(int y)  {
        
                int[][] arr=new int[y][y];  
                int n = arr.length;  
                int max = 0;  //max是一个变量,根据程序流程自加后赋予数组元素
                int count = 0;  
                fillArr(arr,n,max,count);  
                printArr(arr);  
    }  
      
    //两层循环打印二维数组.
    public static void printArr(int[][] superArr) {  
           
        for(int[] inerArr : superArr)  {
                  
            for(int elements : inerArr)  {
                
                
                //因为个位数喝二位数所占的空间补同,所以这里用于统一格式,使得打印更美观
                if(elements<10)                     
                    System.out.print(" "+elements+" ");  
                 else                  
                    System.out.print(elements+" ");      
             }  
             System.out.println();  
        }                  
                      
    }                   
         

    public static void fillArr(int[][] arr,int n,int max,int count) {  //填充螺旋数组,n为每圈元素的边界个数
                  
        
        if(n>0) {
            int j=0;  
            for(int i=0;i<(n-1)*4;i++)  { //打印外圈   (len-1)*4是外圈元素的个数
            
            
                //打印上边界的n-1个元素
                if (i<n-1)  
                    arr[0+count][i+count]=  ++max;  
           //打印右边界
                else if (i<2*n-2) 
                    arr[count+j++][arr.length-1-count] = ++max;  
           //打印下边界
                else if (i<3*n-3)
                    arr[arr.length-1-count][(j--)+count] = ++max; 
           //打印左边界
                else if (i<4*n-4)
                    arr[arr.length-1-(j++)-count][0+count] = ++max;                          
        }  
        //补充条件: 当y值为奇数时,会有循环到n=1的情况,需要补进数组最中间值  
        if(n==1) {
            arr[arr.length/2][arr.length/2] = max+1 ;
        }
        
        count++;  
        n -= 2; //下一圈
        fillArr(arr,n,max,count);  //递归调用
    }  
    }    
                  

      
}           
package com.itheima;


/*需求 : 
 *         有100个人围成一个圈,从1开始报数,
 *         报到14的这个人就要退出。然后其他人重新开始,
 *         从1报数,到14退出。问:最后剩下的是100人中的第几个人?
 *思路:    1.初始化ArrayList数组,循环添加1-100个Integer对象。
 *        2.利用迭代器,遍历集合,当计数器count ==14后,利用iterator.remove()方法删除该元素。
 *        3.当itrator.hasNext()值未false时,初始化迭代器,it = al.iterator();
 *        4.限定条件,集合元素剩下一个的时候,停止。
 *        5.打印该元素
 * 
 * 结果:  92
 * 
 */
import java.util.ArrayList;
import java.util.Iterator;


public class Test9 {

    public static void main(String[] args) {

        //调用addArrayList方法,获取一个长度为100的集合,元素为1-100;
        ArrayList<Integer> al =addArrayList(100); 
        //调用lastOne方法,获取最后一个元素,相当于人的编号。
        int i =lastOne(al);
        System.out.println(i);
        
        
        
        
            
    }
    
    
    //此方法用于初始化一个长度为N,元素为1-N的ArrayList
    public static ArrayList addArrayList (int n) {
        
        ArrayList <Integer>al = new ArrayList<Integer>();
        
        for(int i = 0;i<n;i++) {  //循环n此,加入1---n元素
            al.add(i+1);
        }
        
        return al;   //返回集合
    }
    
    public static int lastOne(ArrayList<Integer> al) {
        
        int count = 0;    //初始化计数器
        Iterator<Integer> it = al.iterator();
        
        
    while(al.size() != 1 ){   //当集合元素的个数不为1时候,持续循环
        
            
            while(it.hasNext()) {   //内循环判定条件,相当于一次从1数到头
                it.next();            
                count++;        
                
                if(count == 14) {  //当数到14时,去除该元素
                    it.remove(); 
                    count = 0;
                }
                    

            }
            it = al.iterator();  //初始化迭代器,从头开始迭代
        }
        
        return it.next();  //返回最后一个元素
    }

}

 

aaa

标签:

原文地址:http://www.cnblogs.com/fanjianan/p/5271219.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!