zoukankan      html  css  js  c++  java
  • 简单排序(java)

    package test;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    //import java.util.Scanner;
    /**
     * Notice:
     * <BR> 1. 仅限使用以下package:
     *        java.lang.*, java.io.*, java.math.*, java.text.*, java.util.*
     * <BR> 2. 请勿变更 package名,类名,test()定义。 
     *
     */
    public class ProgramTest {
        /**
         * 请在此方法内完成代码,但可以增加自己的私有方法。
         * 数据文件inputFile的内容格式为一行一条数据,每条数据有2个字段用逗号分隔,第1个字段为排序用的Key,第二个字段为value。
         * 换行符为'
    '。
         * 数据内容举例如下:
         * abe,xmflsflmfmlsmfs
         * abc,xmlmxlkmffhf
         * 8fj3l,xxjfluu313ooo11
         * 
         * 注意点: 1.本次的测试数据内容都是ASCII字符,无中文汉字.所以不必考虑encoding。
         *        2.本次的测试数据中,key的最大长度8,value的最大长度32。
         * 
    
         * 排序以key的升序,使用String.compareTo()来比较key的大小。最后排序完成的数据写入outputFile。
         * @param inputFile 输入文件
         * @param outputFile 输出文件
         * @param tempFile 临时文件。处理的数据量大的时候,可能会需要用到临时文件。
         * @throws Exception
         */
        
        public static void test(File inputFile, File outputFile, File tempFile) throws Exception {
            //TODO ====================== YOUR CODE HERE ======================
            ProgramTest pt = new ProgramTest();
            List<Item> l = new ArrayList<Item>();
            
            //读输入文件
            //Scanner sc = new Scanner(inputFile);
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader(inputFile));
                String str = null;
                // 一次读入一行,直到读入null为文件结束
                while ((str = reader.readLine()) != null) 
                    l.add(pt.new Item(str.split(",")));
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e1) {
                    }
                }
            }
    //        
    //        while(sc.hasNext())
    //            l.add(pt.new Item(sc.next().split(",")));    
    //        sc.close();
    //        
            pt.items = l.toArray(new Item[l.size()]);
            
            //归并排序
            pt.mergeSort(0, l.size());
            
            //输出文件
            FileOutputStream out = new FileOutputStream(outputFile);
    //        pt.print("");
            for(Item item : pt.items)
                out.write(item.toByte());
            out.close();
            
    //        pt.print("排序前:");
    //        pt.mergeSort(0, l.size());
    //        pt.print("排序后:");
        }
            
        //TODO ====================== YOUR CODE HERE (You can add private method if need) ======================
        /**
         * 打印内存值
         * @param str 提示信息
         */
        private void print(String str){
            System.out.println(str);
            for(Item item : items)
                System.out.println(item.getKey() + "," + item.getValue());
        }
        
        /**
         * 存储每行数据的数据结构
         * @author kdping
         *
         */
        private class Item{
            private String key;
            private String value;
            Item(String[] arr){
                key = arr[0];    value = arr[1];
            }
            public String getValue() {
                return value;
            }
            public void setValue(String value) {
                this.value = value;
            }
            public String getKey() {
                return key;
            }
            public void setKey(String key) {
                this.key = key;
            }
            public int compareTo(Item item){
                return this.key.compareTo(item.key);
            }
            public byte[] toByte(){
                return (key+","+value).getBytes(); 
            }
        }
        
        private Item[] items;
        
        /**
         * 归并两个有序序列,items[start,mid),items[mid,end)
         * @param start  
         * @param end   
         */
        private void merge(int start, int end){
            int n = end - start;    int mid = (n >> 1) + start;
            int k1 = start, k2 = mid, i = 0;
            Item[] titems = new Item[n + 1];
            while(k1<mid && k2<end){
                if(items[k1].compareTo(items[k2]) < 0)
                    titems[i++] = items[k1++];    
                else titems[i++] = items[k2++];
            }
            while(k1 < mid) titems[i++] = items[k1++];
            while(k2 < end) titems[i++] = items[k2++];
            for(i = 0; i < n; i++) items[start++] = titems[i];
        }
        /**
         * 对items(start,end]进行归并排序
         * @param start
         * @param end
         */
        private void mergeSort(int start, int end){
            int n = end - start;
            int mid = (n >> 1) + start;
            if(n < 2) return;
            mergeSort(start, mid);
            mergeSort(mid, end);
            merge(start, end);
        }
        
        
        /** 
         * 测试函数
         * @param args
         */
    //    public static void main(String[] args) {
    //        // TODO Auto-generated method stub
    //        File inputFile = new File("D:\Download\javatest\javatest\data\in.txt");
    //        File outputFile = new File("D:\Download\javatest\javatest\data\out.txt");
    //        File tmpFile = new File("D:\Download\javatest\javatest\data\itdm.txt");
    //        try {
    //            
    //            test(inputFile, outputFile, tmpFile);
    //        } catch (Exception e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
    //    }
        
        //=================================================================
    
    }
    ...

    一道面试题:http://zhaopin.e-pointchina.com/zhaopintest/techtest_test_java.html?testId=zhaopin_java&qSetId=zhaopin_java_sort&qId=zhaopin_java_sort1

    题目见代码,原来用Scanner类似乎会报访问权限不足。

    结果超时,50万的数据,应该是时间花在磁盘IO上的原因。

  • 相关阅读:
    JS使用小记
    CSS使用小记
    POST Raw JSON提交
    获取当月的某天
    bootstrap-datetimepicker的中文显示问题
    学习总结——Selenium元素定位
    Android常用控件及对应Robotium API
    Junit4断言
    Junit3断言
    Robotium怎样判断测试结果
  • 原文地址:https://www.cnblogs.com/ramanujan/p/5844012.html
Copyright © 2011-2022 走看看