using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;
namespace CS_ScanSample1
{
 /// <summary>
 /// Logic 的摘要说明。
 /// </summary>
 public class Logic
 {
  /// <summary>
  /// 从排序文本中查找指定关键字的行
  /// </summary>
  /// <param name="path">路径</param>
  /// <param name="keyString">关键字</param>
  /// <param name="rowLength">一行的长度</param>
  /// <param name="keyStart">开始位置</param>
  /// <param name="keyLength">取的长度</param>
  public static DataTable Find(string path, string keyString, int rowLength, int keyStart, int keyLength)
  {
   DataTable ddt=new DataTable();
   ddt.Columns.Add("Titlex");
   ddt.Columns.Add("BookNum");
   long s = DateTime.Now.Ticks;

ArrayList list = new ArrayList();
   FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read);
   long fileLength = fs.Length;
   int recCount = (int)(fileLength / rowLength);
   int recStart = 0;
   int recEnd = recCount;
   string rowKeyString;
   int curRowNo = 0;
   int result;
   curRowNo = (recStart + recEnd) / 2;
   int seekCount = 0;
      byte[] rowBytes;

do
   {
    seekCount++;
    rowBytes = ReadRow(fs, curRowNo, rowLength);
    rowKeyString = Encoding.Default.GetString(rowBytes, keyStart, keyLength).Trim();
    result = rowKeyString.CompareTo(keyString);
    if (result == 0)
    {
     // 提取该记录前后相同的数据
     int recMore = curRowNo;
     do
     {
     // list.Add(Encoding.Default.GetString(rowBytes));
      ddt = InStrOutTable(Encoding.Default.GetString(rowBytes,0,rowBytes.Length),ddt);
      recMore++;

rowBytes = ReadRow(fs, recMore, rowLength);
      rowKeyString = Encoding.Default.GetString(rowBytes, keyStart, keyLength).Trim();
      result = rowKeyString.CompareTo(keyString);

} while (result == 0 && recMore <= recCount);
     recMore = curRowNo - 1;
     do
     {
      rowBytes = ReadRow(fs, recMore, rowLength);
      rowKeyString = Encoding.Default.GetString(rowBytes, keyStart, keyLength).Trim();
      result = rowKeyString.CompareTo(keyString);
      recMore--;
      if (result == 0)
      {
      // list.Add(Encoding.Default.GetString(rowBytes));
       ddt = InStrOutTable( Encoding.Default.GetString(rowBytes,0,rowBytes.Length),ddt);
      }

} while (result == 0 && recMore >= 0);
     break;
    }
    else if (result > 0)    // 当前记录Key大于要查找的Key,则向前查找
    {
     if (recEnd <= recStart) break;
     recEnd = curRowNo - 1;
    }
    else                    // 当前记录Key小于要查找的Key,则向后查找
    {
     if (recStart >= recEnd) break;
     recStart = curRowNo + 1;
    }
    curRowNo = (recStart + recEnd) / 2;
   } while (true);

fs.Close();
   long e = DateTime.Now.Ticks;
   //Console.WriteLine("Time={0},Times={1}", TimeSpan.FromTicks(e - s), seekCount);

return ddt;
   //  return list;
          
  }

private static byte[] ReadRow(FileStream fs, int recno, int rowLength)
  {
   
   byte[] rowBytes = new byte[rowLength - 2];
   if(recno <0) return rowBytes;
   int position = recno * rowLength;
   fs.Seek(position, SeekOrigin.Begin);
   fs.Read(rowBytes, 0, rowLength - 2);
   return rowBytes;
  }
  public static DataTable InStrOutTable( string arowStr,DataTable Dt)
  {
   string ztm = MySubstring(arowStr, 20, 60).Trim().Replace("'", "’");
   int fbs = Convert.ToInt32((MySubstring(arowStr, 120, 10).Trim().Replace("'", "’")=="") ? "0" :MySubstring(arowStr, 120, 10).Trim().Replace("'", "’"));
   return InputDataTable( ztm, fbs,Dt);

}

//

/// <summary>
  /// 把一行加入DataTable里
  /// </summary>
  /// <param name="ZykDt1">DataTable</param>
  /// <param name="idxstr">IdxStr</param>
  /// <param name="Titlexstr">Title</param>
  /// <param name="booknumstr">nCopies</param>
  /// <returns></returns>
  private static DataTable InputDataTable( string Titlexstr, int booknumstr,DataTable ZykDt1)
  {

string Titlex = Titlexstr;
   int BookNum = booknumstr;
   DataRow row = ZykDt1.NewRow();
   row["Titlex"] = Titlex;
   row["BookNum"] = BookNum;
   ZykDt1.Rows.Add(row);
   return ZykDt1;

}
  /// <summary>
  /// 取字符
  /// </summary>
  /// <param name="string1">字符串</param>
  /// <param name="start">开始位置</param>
  /// <param name="length">长度</param>
  /// <returns></returns>
  private static string MySubstring(string string1, int start, int length)
  {

if (string1 == "" || string1 == null)
   {
    return "";
   }
   else
   {
    byte[] s = Encoding.Default.GetBytes(string1);
    if (s.Length >= start + length)
    {
     return Encoding.Default.GetString(s, start, length);
    }
    else
    {
     if (s.Length > start)
     {
      return Encoding.Default.GetString(s, start, s.Length - start);
     }
     else
     {
      return "";
     }
    }
   }

}
      
 }
}

文本二叉树折半查询及其截取值相关推荐

  1. mysql substring函数截取值后赋给一个declare变量

    今天写的一个mysql存储过程涉及到对一个传入参数的字符串截取,然后需要判断截取字符串进行一系列操作,最开始用select  subtring() into 这样的方法将截取值赋于declare变量直 ...

  2. python如何在列表中查找元素位置_查找元素在list中的位置以及折半查询

    问题 查找某个值在list中的位置 解决思路 能够用折半查询的方法解决此问题. 解决(Python) #! /usr/bin/env python #coding:utf-8 #折半查找某个元素在li ...

  3. 剑指offer:面试题34. 二叉树中和为某一值的路径

    题目:二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和  ...

  4. mysql sql查询json数据_mysql如何查询json的值

    mysql查询json的值的方法:首先打开命令窗口:然后执行SQL语句"SELECT REPLACE(json_extract(push_data,'$.carRenewalInfoVo.l ...

  5. LeetCode 965 Univalued Binary Tree--判断二叉树的所有节点的值是否相同--python,java解法

    题目地址:Univalued Binary Tree - LeetCode Acceptance: 67.6% Difficulty: Easy A binary tree is univalued ...

  6. Java 折半查询_java之折半查询

    /** * Created by rabbit on 2014-5-12. */ public class HalfSerach { public static void main(String[] ...

  7. 《剑指offer》— JavaScript(24)二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 前序遍历二叉树, ...

  8. java 将查询到的值 存下_MyBatis3.x 从入门到精通(六)查询

    概述: 在前面的章节中,对查询已经有过接触,先做一下概述:接触过的查询有3种.第1种:根据id查询(传入1个参数):第2种:多条件查询(传入多个参数):第3种查询:多条件查询(传入1个对象).这里是在 ...

  9. 《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表

    一.从上往下打印二叉树: 1.题目: 上往下打印出二叉树的每个节点,同层节点从左至右打印. 2.解题思路: 用arraylist模拟一个队列来存储相应的TreeNode. 3.代码实现: public ...

最新文章

  1. 使用tmpfs缓存文件提高性能
  2. 利用java实现的一个发送手机短信的小例子
  3. 2022年电商发展分析报告
  4. phpcms发布文章:overflow不显示问题(解决“代码横向溢出”)- 含代码、案例、截图
  5. python operator 多属性排序_快速入门Python必备的基础知识
  6. QT笔记之VS2010 Qt中导入qrc资源文件
  7. 远程计算机统考试题,2015年电大远程网络教育计算机应用基础统考模拟试题集...
  8. linux ulipad,Python for Ulipad(总结ulipad使用)
  9. 【codemirror】Json编辑器使用总结
  10. C/C++ 实现模拟键盘鼠标
  11. 2018蓝桥杯B组国赛第四题 调手表(bfs)
  12. Ext3、Ext4、FAT、FAT32、NTFS、exFAT、Sparse、Raw
  13. 归并排序(C语言简单实现)
  14. 使用eNSP搭建一个简单的网络
  15. 使用Easyexcel动态生成excel
  16. try/catch 用法
  17. CAS:2183440-52-8,Cyanine5.5 azide是染料叠氮化物
  18. 汉字自己主动注音程序
  19. 【图像处理】如何获取30FPS的1080P视频流
  20. 育人优化计算机试题,优化公寓育人氛围,增强学生自律意识——数学系、计算机科学系开展PPT制作和个人简历制作大赛...

热门文章

  1. 《MySQL tips:查询时,尽量不要对字段进行操作》
  2. c语言中图形驱动程序功能_C / C ++中的图形:一些更有趣的功能
  3. scala怎么做幂运算_Scala幂(幂)函数示例
  4. 使用JavaScript中的示例编号MAX_VALUE属性
  5. python 爬虫 音乐下载 歌手_python爬虫批量下载全民K歌音乐
  6. 138. 复制带随机指针的链表 golang
  7. C++ 继承中的同名成员的情况01
  8. OC中的基本容器和基本数据类型
  9. 201301 JAVA2~3级---走格子
  10. 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)