机试代码

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.LinkedHashMap;
import java.util.Map;

public class Application {
   /**
    * 定义需要读取的文件的名称,放在项目主目录或者使用绝对路径
    */
   private static final String FILE_NAME = "stock_price.txt";
   /**
    * 定义时间格式化字符串
    */
   private static final String PATTERN = "yyyy-MM-dd";
   /**
    * 定义sql server驱动
    */
   private static final String DRIVER_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
   /**
    * 初始化时间格式化类
    */
   private static final SimpleDateFormat SDF = new SimpleDateFormat(PATTERN);

   public static void main(String[] args) {
      //从文件读取数据
      Map<String, String> stocks  = readFromFile();
   
      //将数据转化为单调递增区间打印
      printMomotone(stocks);
      //从数据库读取数据
      readFromDB();
   }

   /**
    * 从文件读取数据
    * @return 日期,价格的map
    */
   private static Map<String, String> readFromFile() {
      BufferedReader reader = null;
      Map<String, String> stocks = new LinkedHashMap<String, String>();
      try {
         File file = new File(".");
         File txtFile = new File(file.getCanonicalPath() + File.separator + FILE_NAME);
         reader = new BufferedReader(new InputStreamReader(new FileInputStream(txtFile), "UTF-8"));
         String line = null;
         /**
          * 按行读取
          */
         while ((line = reader.readLine()) != null) {
            String[] lines = line.split("\\s+");
            String price = lines[0].trim();
            String priceDate = lines[1].trim();
            stocks.put(priceDate, price);
         }
         //排序并打印
         sortAndPrint(stocks);
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         if (reader != null) {
            try {
               reader.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
      return stocks;
   }

   /**
    * 对map的key进行排序
    * @param stocks
    * @return
    */
   private static String[]sortKeys(Map<String,String>stocks){
      String[] keys = stocks.keySet().toArray(new String[] {});

      for (int i = 0; i < keys.length; i++) {
         for (int j = 0; j < i; j++) {
            swap(keys, i, j);
         }
      }

      return keys;
   }
   /**
    * 打印输出
    * @param stocks
    */
   private static void sortAndPrint(Map<String, String> stocks) {
      String[] keys = sortKeys(stocks);
      System.out.println("按日期升序结果:");
      for (String key : keys) {
         System.out.println(String.format("%s %s", key, stocks.get(key)));
      }

   }

   /**
    * 从数据库读取
    */
   private static void readFromDB() {
      Connection conn = getConnection();
      
      String sql = "select * from data_stk_prc";
      Statement stm = null;
      ResultSet rs = null;
      Map<String, String> stocks = new LinkedHashMap<String, String>();
      try {
         stm = conn.createStatement();
         rs = stm.executeQuery(sql);
         while (rs.next()) {
            stocks.put(rs.getString("date"), rs.getString("price"));
         }
         /**
          * 排序可考虑数据库进行实践格式化并按升序排列
          */
         sortAndPrint(stocks);
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } finally {
         if (rs != null) {
            try {
               rs.close();
            } catch (SQLException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
         }
         if (stm != null) {
            try {
               stm.close();
            } catch (SQLException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
         }
         if (conn != null) {
            try {
               conn.close();
            } catch (SQLException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
         }
      }

   }

   /**
    * 数组排序
    * @param eles
    * @param i
    * @param j
    */
   private static void swap(String[] eles, int i, int j) {
      long time1 = stringToTimestamp(eles[i]);
      long time2 = stringToTimestamp(eles[j]);
      if (time1 < time2) {
         String temp = eles[i];
         eles[i] = eles[j];
         eles[j] = temp;
      }

   }

   /**
    * 将字符串转化为时间方便对比,或者直接字符串大小对比
    * @param d
    * @return
    */
   private static long stringToTimestamp(String d) {
      try {
         return SDF.parse(d).getTime();
      } catch (ParseException e) {
         e.printStackTrace();
      }
      return -1L;
   }

   /**
    * 获取数据库连接,可以集成mybatis
    * @return
    */
   private static Connection getConnection() {

      /**
       * 硬编码或配置文件读取数据库信息
       * 需要在classpath下增加sql server的驱动
       */
      String dbURL = "jdbc:sqlserver://10.132.20.115:1433;DatabaseName=KSDB";
      String userName = "ksuser";
      String userPwd = "123@pwd";
      try {
         Class.forName(DRIVER_NAME);
         Connection dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
         return dbConn;
      } catch (Exception e) {
         e.printStackTrace();
         System.out.print("连接失败");
      }
      return null;
   }

   /**
    * 打印打掉区间
    * @param stocks
    */
   private static void printMomotone(Map<String,String> stocks){
      String[] keys = sortKeys(stocks);
      float temp = -1F;
      int start =  0;
      for(int i=0;i<keys.length;i++){
         Float current = Float.valueOf(stocks.get(keys[i]));
         /**
          * 针对当前场景下的单调区间
          */
         if(current<temp){
            System.out.println(String.format("[%s %s,%s %s]",keys[start],stocks.get(keys[start]),keys[i-1],stocks.get(keys[i-1])));
            start = i;
         }
         
         if(i==keys.length-1 && current>temp){
            System.out.println(String.format("[%s %s,%s %s]",keys[start],stocks.get(keys[start]),keys[keys.length-1],stocks.get(keys[keys.length-1])));
         }else if(i==keys.length-1){
            System.out.println(String.format("[%s %s,%s %s]",keys[start],stocks.get(keys[start]),"-","-"));
         }
         temp = current;
      }
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值