8月 25

在java.util包中提供了一些集合类,常用的有List、Set和Map类,其中List类和Set类继承了Collection接口。这些集合类又称为容器,它们与数组不同,数组的长度是固定的,而集合的长度是可变的,数组用来存放基本数据类型的数据,集合用来存放类对象的引用。
List接口、Set接口、Map接口以及Collection接口的主要特征如下:
● Collection接口是List接口和Set接口的父接口,通常情况下不被直接使用。
● List接口继承了Collection接口,List接口允许存放重复的对象,排序方式为按照对象的插入顺序。
● Set接口继承了Collection接口,Set接口不允许存放重复的对象,排序方式为按照自身内部的排序规则。
● Map接口以键值对(key—value)的形式存放对象,其中键(key)对象不可以重复,值(value)对象可以重复,排序方式为按照自身内部的规则。

Collection接口的方法

int size();  

boolean isEmpty();

boolean contains(Object o);

Iterator<E> iterator();

Object[] toArray();

<T> T[] toArray(T[] a);

boolean add(E e);

boolean remove(Object o);

boolean containsAll(Collection<?> c);

boolean addAll(Collection<? extends E> c);

boolean removeAll(Collection<?> c);

boolean retainAll(Collection<?> c);

void clear();

boolean equals(Object o);

int hashCode();

written by ocean

8月 24

做一个小应用

要把表里的数据读取出来放入list,测试用的大概240万条数据吧

之前都是用自己的orm组件直接读出来dataTable,然后转化成IList的

统计了一下时间大概82秒的样子

现在换成datareader之后,为26秒

特记录一下,如果有更快的方法希望有能人可以告知一下

            List<StockInfo> list = new List<StockInfo>();
           using (SqlConnection connection = new SqlConnection(Const.SqlServerConnectionString))
           {
               SqlCommand cmd = connection.CreateCommand();
               cmd.CommandText = "select Code,Date,High,Low,[Open],[Close],Vol,Amount   FROM TB_StockDayInfo";
               cmd.CommandType = CommandType.Text;
               connection.Open();
               SqlDataReader reader = cmd.ExecuteReader();
               if (reader.HasRows)
               {
                   while (reader.Read())
                   {
                       StockInfo stockInfo = new StockInfo();
                       stockInfo.Code=reader.GetInt32(0);
                       stockInfo.Date=reader.GetDateTime(1);
                       stockInfo.High=reader.GetDecimal(2);
                       stockInfo.Low=reader.GetDecimal(3);
                       stockInfo.Open=reader.GetDecimal(4);
                       stockInfo.Close=reader.GetDecimal(5);
                       stockInfo.Vol=reader.GetDecimal(6);
                       stockInfo.Amount = reader.GetDecimal(7);
                       list.Add(stockInfo);
                   }
               }
               reader.Close();
           }
           return list;

written by ocean

8月 23

IList—->DataTable

       public static DataTable ToDataTable(IList list)
       {
           DataTable result = new DataTable();
           if (list.Count > 0)
           {
               PropertyInfo[] propertys = list[0].GetType().GetProperties();
               foreach (PropertyInfo pi in propertys)
               {
                   result.Columns.Add(pi.Name, pi.PropertyType);
               }

               for (int i = 0; i < list.Count; i++)
               {
                   ArrayList tempList = new ArrayList();
                   foreach (PropertyInfo pi in propertys)
                   {
                       object obj = pi.GetValue(list[i], null);
                       tempList.Add(obj);
                   }
                   object[] array = tempList.ToArray();
                   result.LoadDataRow(array, true);
               }
           }
           return result;
       }

DataTable—->IList

http://hi.baidu.com/ysuhy/blog/item/5b993f003168ca0d728da540.html

written by ocean

8月 22

MA5:=MA(C,5);
MA10:=MA(C,10);
VOL4:=REF(VOL,4);
VOL3:REF(VOL,3);
VOL2:REF(VOL,2);
VOL1:REF(VOL,1);

DIF:=EMA(CLOSE,12)-EMA(CLOSE,26);
DEA:=EMA(DIF,9);
MACD:=(DIF-DEA)*2;

XG:1=1
AND VOL4>VOL3
AND VOL3>VOL2
AND VOL2>VOL1
AND VOL1>VOL
AND DIF>0
AND DEA>0
AND MA10<C;
;

written by ocean

8月 17

Selenium是一个可以通过录制脚本,执行脚本的好玩意

下载地址:http://seleniumhq.org/download/

记录一个demo:

privateIWebDriverdriver;
privateStringBuilderverificationErrors;
privatestringbaseURL;

publicvoidStart() {

driver=newFirefoxDriver();
baseURL="http://www.jielongdaquan.com/";
verificationErrors=newStringBuilder();
driver.Navigate().GoToUrl(baseURL);
driver.FindElement(By.Id("search")).Clear();
driver.FindElement(By.Id("search")).SendKeys("一心一意");
driver.FindElement(By.CssSelector("input.d_btnsearch1")).Click();

Console.Read();
}

执行之后可以打开  接龙大全这个网站

自动输入成语,自动点击搜索

唯一不足是生成的脚本代码不是太好,需要手工修改一下

 

 

 

2016.10.30

补充一点调用IE的方式

环境win10+ie11

需呀IEDriverServer.exe的帮助

下载地址 (两段拼在一起)

selenium-release.storage.google
apis.com/index.html?path=3.0/

将IEDriverServer.exe放在bin目录里面即可

注意,下载32位的,64位的sendkeys会很慢

另外附一段百度cdn加黑名单的脚本

            foreach (var line in lines)
            {
                try
                {
                    i++; 
                    var inputText =driver.FindElement( By.XPath("//div[@id='challenge']/div/div[2]/input"));
                    var btn=driver.FindElement(By.XPath("//div[@id='challenge']/div/div[2]/div[1]"));
                    inputText.Clear();
                    Thread.Sleep(500);
                    inputText.SendKeys(line);
                    Thread.Sleep(500);
                    btn.Click(); 
                    Thread.Sleep(2000); 
                    Console.WriteLine(i + "/" + lines.Length);
                }
                catch (Exception ex)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("ERROR:");
                }
            }

written by ocean

8月 15

 SqlBulkCopy可以批量插入数据库数据,非常快
做个记录
public static void Inert2DBBySqlBulkCopy(DataTable data, string tableName)
       {
           using (SqlConnection conn = new SqlConnection(Const.ConnectionString))
           {
               if (conn.State != ConnectionState.Open)
                   conn.Open();
               using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn))
               {  
                   sqlBulkCopy.ColumnMappings.Add(0, "Code");
                   sqlBulkCopy.ColumnMappings.Add(1, "Date");
                   sqlBulkCopy.ColumnMappings.Add(2, "Open");
                   sqlBulkCopy.ColumnMappings.Add(3, "High");
                   sqlBulkCopy.ColumnMappings.Add(4, "Low");
                   sqlBulkCopy.ColumnMappings.Add(5, "Close");
                   sqlBulkCopy.ColumnMappings.Add(6, "Vol");
                   sqlBulkCopy.ColumnMappings.Add(7, "Amount");

                   sqlBulkCopy.BatchSize = data.Rows.Count;
                   sqlBulkCopy.BulkCopyTimeout = 60;
                   sqlBulkCopy.DestinationTableName = tableName;
                   sqlBulkCopy.WriteToServer(data);
               }
               if (conn.State != ConnectionState.Closed)
                   conn.Close();
           }
       }

written by ocean

8月 10

删除字段

ALTER TABLE CMS_Document  DROP COLUMN RuleType  

添加字段

ALTER TABLE CMS_Document  ADD COLUMN RuleType2 VARCHAR(10);

更新字段

UPDATE CMS_Document A,CMS_Template B
SET A.RuleType2=B.RuleType
WHERE A.TemplateID = B.TemplateID

written by ocean

8月 09

MA:简单移动平均
SMA:移动平均
EMA(EXPMA):指数移动平均
EXPMEMA:指数平滑移动平均
MEMA:平滑移动平均
DMA:动态移动平均
XMA(X,M):偏移移动平均
EMA同EXPMA一样的意思
EMA(X,N)=SMA(X,N+1,2)

SMA:返回累积平均
用法:
SMA(X,N,M):X的M日累积平均,M为权重,如Y=(X*M+Y'*(N-M))/N
MA(X,N)=SMA(X,N,1)
MEMA(X,N)与MA的差别在于起始值为一平滑值,而不是初始值
EXPMEMA同EMA(即EXPMA)的差别在于他的起始值为一平滑值

DMA:求动态移动平均.
用法:
DMA(X,A),求X的动态移动平均.
算法: 若Y=DMA(X,A)则 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1.
例如:DMA(CLOSE,VOL/CAPITAL)表示求以换手率作平滑因子的平均价

XMA(X,M):X的M日偏移移动平均
这种移动平均可能会用到未来数据,用到了当日以后M/2日的数据,只供内部保留测试使用

written by ocean

8月 01

1、“==”运算符

(1)比较基本数据类型变量

当两个基本数据类型的操作元通过“==”运算符比较是否相等时,比较的是这两个操作元的值是否相等,如果相等结果为True,否则为False,在比较时不考虑操作元的数据类型。

例如:

int i = 98; 
int j = -98; 
float f = 98.0f; 
System.out.println(i==j); //输出结果:false 
System.out.println(i==f); //输出结果:true 
System.out.println(i=='b'); //输出结果:true 
System.out.println(j==-'b'); //输出结果:true

(2)比较引用类型变量

当两个引用类型的变量通过“==”运算符比较是否相等时,比较的是这两个变量是否引用同一个对象,如果是结果为True,否则为False。

例如:

Integer num1 = new Integer(100); //创建一个Integer对象,并通过num1变量进行引用 
Integer num2 = new Integer(100);//创建另一个Integer对象,并通过num2变量进行引用 
System.out.println(num1==num2);//输出结果:false 
System.out.println(num1!=num2);//输出结果:true

代码中虽然变量num1与num2引用的Integer对象的值都为100,但它们却是两个不同的对象,因此表达式“num1==num2”进行比较的结果为False。

下面将以上的代码进行修改:

Integer num1 = new Integer(100); 
Integer num2 = new Integer(100); 
num1 = num2; //将num2引用的对象赋值给num1,使得这两个变量引用同一个对象 
System.out.println(num1==num2); //输出结果:true 
System.out.println(num1!=num2); //输出结果:false

下面通过“==”运算符向读者介绍Java包装类的自动装箱与拆箱的相关知识。先来看下面的代码:

Integer num1 = 280;//将自动进行280转换为Integer对象的装箱操作 
Integer num2 = 280;//将自动进行280转换为Integer对象的装箱操作 
System.out.println(num1==num2);//输出结果:false

代码中的变量num1与num2分别引用了两个对象,根据“==”运算符的比较规则,只有两个变量引用的是同一个对象时,比较的结果才为True,因此结果为False是正确的。

下面将代码进行如下修改:

Integer num1 = 80;//将自动进行80转换为Integer对象的装箱操作 
Integer num2 = 80;//将自动进行80转换为Integer对象的装箱操作 
System.out.println(num1==num2);//输出结果:true

这两段代码几乎是一样的,只不过改动了后者的数值,返回的结果却是True,这是因为Java包装类在进行自动装箱及拆箱时隐藏了一些细节上的操作。

Java在执行包装类的自动装箱功能时,对于-128~127之间的整数(包括-128与127)被装箱为Integer对象后,该对象会被另一个对该整数进行自动装箱的操作重复使用,即多次对同一个-128~127范围内的整数进行Integer装箱的操作,使用的都是第一次进行装箱操作时生成的对象,因此在进行“==”比较时,返回的结果是True。如果对超出这个范围内的整数进行装箱操作,那么对该整数的每次的Integer装箱操作都会生成一个新的Integer对象,因此在进行“==”比较时,比较的是不同的对象,返回的结果为False。

应用“==”运算符进行比较的两个引用类型的变量,其被显式声明的类型必须相同或者具有继承关系,否则编译会出错。

例如:存在A、B、C3个类,B、C类都继承自类A。变量myA被显式声明为A类型,变量myB被显式声明为B类型,变量myC被显式声明为C类型,变量D被显式声明为A类型但引用了类B的对象,变量myE被显式声明为A类型但与变量myB引用了同一个对象。

A myA = new A();//变量myA被显式声明为A类型 
B myB = new B();//变量myB被显式声明为B类型 
C myC = new C();//变量myC被显式声明为C类型 
A myD = new B();//变量D被显式声明为A类型但引用了类B的对象 
A myE = myB;//变量myE被显式声明为A类型但与变量myB引用了同一个对象 
System.out.println(myA==myB);//输出结果:false 
System.out.println(myA==myD);//输出结果:false 
System.out.println(myC==myD);//输出结果:false 
System.out.println(myB==myD);//输出结果:false 
System.out.println(myB==myE);//输出结果:true

如果在上述代码中加入如下代码来输出变量myB与变量myC的比较结果,则编译出错。

System.out.println(myB==myC);//编译出错

因为变量myB与变量myC分别引用的是类B与类C的对象,而类B与类C的类型不同,并且没有继承关系,所以不能通过“==”运算符进行比较运算。

数组引用类型间也可以通过“==”运算符进行比较,例如:

float f1[] = {1.1F,2.2F,3.3F}; 
float f2[] = {1.1F,2.2F,3.3F}; 
float f2[] = null; 
double d[] = {1.1,2.2,3.3}; 
System.out.println(f1==d);//编译出错,类型不同 
System.out.println(f1==f2);//编译成功,结果为false 
System.out.println(f3==f1);// 编译成功,结果为false 
f3 = f1; 
System.out.println(f3==f1);// 编译成功,结果为true

2、equals()方法

通常,Java中的类都继承自java.lang.Object类,在Object类中定义了一个equals()方法,其源代码如下:

public boolean equals(Object obj){ 
return (this == obj); 
}

根据源代码可知,equals()方法的比较规则实际上就是“==”运算符的比较,当参数obj引用的对象与当前对象(即调用equals()方法的对象)为同一个对象时,返回True值,否则返回False值。

例如:

A objA1 = new A(); 
A objA2 = new A(); 
A objA3 = objA1; //变量objA3与变量objA1引用同一个对象 
System.out.println(objA1==objA2); //输出结果:false 
System.out.println(objA1.equals(objA2)); //输出结果:false 
System.out.println(objA1==objA3); //输出结果:true 
System.out.println(objA1.equals(objA3)); //输出结果:true

在JDK中提供的一些类重写了Object类中的equals()方法,重新定制了比较规则,如果两个对象的类型一致,并且内容相同(不能同时为null),则返回True。这些类包括包装类、String和java.util.Data等。

下面给出Integer包装类中equals()方法的源代码:

public boolean equals(Object obj){ 
if(obj instanceof Integer){//判断obj引用的对象是否为Integer类的实例 
return value == ((Integer)obj).inValue();//判断obj引用的对象是否与当前对象的内容相同 
} 
return false; 
}

其中,instanceof用来判断一个引用变量所引用的对象是否为一个类的实例。

例如:变量num1与num2分别引用了两个不同的Integer对象,但它们的内容都是100,因此使用“==”运算符进行比较的结果为False,使用equals()方法进行比较的结果为True;变量date1与date2分别引用了两个不同的java.util.Data类对象,但它们的内容都是当前系统时间,因此结果同上。

Integer num1 = new Integer(100); 
Integer num2 = new Integer(100); 
Date date1 = new Date(); //创建一个Date()对象,值为系统当前时间 
Date date2 = new Date(); //创建另一个Date()对象,值为系统当前时间 
System.out.println(num1==num2); //输出结果:false 
System.out.println(num1.equals(num2)); //输出结果:true 
System.out.println(date1==date2); //输出结果:false 
System.out.println(date1.equals(date2)); //输出结果:true

在比较字符串是否相等时,为了能够正确得到预期的运行结果,应该采用equals()方法进行比较。

例如:

String name = "liqiong"; 
if(name=="liqiong") 
System.out.println("登陆成功!"); 
else
System.out.println("登陆失败!");

运行结果如下:

登陆成功!

虽然上述代码的运行结果与预期的相同,但如果将代码中的第一行进行修改:

String name = new String("liqiong");

则得到如下结果:

登陆失败!

在实际编程中,变量name的值很可能是通过参数传递的,并且该参数可能是一个String型的字面常量或者是String型对象,因此通过“==”进行比较时会得到两种结果,需要应用equals()方法来比较字符串是否相等。

在自定义的类中也可以重写Object类中的equals()方法,重新定制比较规则。例如创建了一个Student类用来封装学生信息,其中包含一个String型的number属性,该属性存储学生学号。如果想定义两个Student类对象的number属性内容相同,则表示这两个对象存储的是同一个学生的信息的比较规则,通过equals()方法实现时,就可进行如下定义:

public class Student{ 
private String number; 
public Student(String number){ 
this.number = number; 
} 
public boolean equals(Object obj){ 
if(this == obj){ 
return true; 
} 
if(obj instanceof Student){ 
if((this.number).equals(((Student)obj).number)) 
return true; 
} 
return false; 
} 
}

然后通过构造方法创建两个Student类对象,它们的number属性都被赋值为字符串“1001”,并分别通过变量st1与st2引用这两个对象,则应用equals()方法比较这两个对象的结果为True。

Student st1 = new Student("1001"); 
Student st2 = new Student("1001"); 
System.out.println(st1==st2); //输出结果:false 
System.out.println(st1.equals(st2)); //输出结果:true

written by ocean

8月 01

在Java中提供了字符串与其他数据类型之间的转换,尤其是与基本数据类型和包装类间的转换,会被经常用到。

1、将其他数据类型转换为字符串

将其他数据类型转换为字符串存在两种方法:调用类的toString()方法和调用String类的valueOf()方法。

(1)调用类的toString()方法。如果该类为基本数据的包装类,则可以使用带参数的或不带参数的toString()方法。

不带参数的toString()方法为类的非静态方法,因此必须通过类对象进行调用。例如将一个Integer对象转换为字符串:

Java代码

  1. Integer num = new Integer(300);

  2. System.out.println("result="+(num.toString()+200));

运行结果如下:
result=300200

带参数的toString()方法为类的静态方法,因此可以通过类直接进行调用。方法中的参数应为与包装类对应得基本数据类型变量或字面常数。例如转换一个float类型数据为字符串:

Java代码

  1. float f=12.345f;

  2. System.out.println("result="+(Float.toString(f)+1.02f));

运行结果如下:
result=12.3451.02
通常情况下,不带参数的toString()方法用来将包装类数据转换为字符串,而带有参数的toString()方法则用来将基本数据类型转换为字符串。
在Java中的java.lang.Object类中提供了一个不带参数的toString()方法,该方法返回当前对象的字符串表示,返回值的形式为类名+“@”+十六进制数表示对象的地址。所有从Object类派生的子类都可以调用toString()返回类对象的字符串表示,并且子类可以覆盖toString()方法来返回其他值。另外在一些情况下,系统会自动调用对象的toString()方法,例如print()方法和字符串“+”运算。例如:

Java代码

  1. public class ConversionDemo1{

  2. public static void main(String args[]){

  3. ConversionDemo1 c=new ConversionDemo1();//创建ConversionDemo1类对象

  4. String s="输出:"+c;//系统会先调用c对象的toString()方法,然后再进行字符串“+”运算

  5. System.out.println(c);//系统会先调用c对象的toString()方法,然后输出方法的返回值

  6. System.out.println(s);

  7. }

  8. }

运行结果如下:
ConversionDemo1@7d8a992f
输出:ConversionDemo1@7d8a992f

(2)调用String类的valueOf()方法。通过调用String类的valueOf()方法既可以将包装类型数据转换为字符串,也可以将基本数据类型或字面常量转换为字符串,另外,在转换其他引用类型对象时,等价于调用该对象的toString()方法。例如分别转换float型数据为字符串,转换Double类型数据为字符串,转换ConversionDemo2类对象为字符串:

Java代码

  1. public class ConversionDemo2{

  2. public static void main(String args[]){

  3. float f = 45.678f;//定义一个float型变量,并赋值为45.678

  4. Double d = new Double(12.345);//创建一个Double对象

  5. ConversionDemo2 c=new ConversionDemo2();//创建一个ConversionDemo2类对象

  6. System.out.println(String.valueOf(f)+10);//调用String的valueOf(float f)方法转换float型数据为字符串,然后与整数10进行运算

  7. System.out.println(String.valueOf(d)+10);//调用String的valueOf(Object obj)方法转换Double对象为字符串,然后与整数10进行运算

  8. System.out.println(String.valueOf(c));//调用String的valueOf(Object obj)方法转换类对象c为字符串,然后输出

  9. }

  10. }

运算结果如下:
45.67810
12.34510
ConversionDemo2@8dc8569

Java中的基本数据类型都可以通过String中对应的valueOf()方法转换为字符串,然而在String类中并没有提供valueOf(byte b)和valueOf(short s)方法来转换byte和short型数据为字符串,但如下的方法调用是合法的:

Java代码

  1. byte b='a';

  2. short s=123;

  3. System.out.println(String.valueOf(b));//输出结果:97

  4. System.out.println(String.valueOf(s));//输出结果:123

这是因为byte和short被自动转换为了int型,从而调用的是valueOf(int i)方法。

2、将字符串转换为基本数据类型

(1)通过包装类的parseXxx()方法将一个字符串转换为该包装类对应的基本数据类型,但要求字符串必须为数字形式,例如int num = Integer.parseInt("123");是合法的,而int num = Integer.paseInt("abc");则会抛出“java.lang.NumberFormatException:For input string:”abc””异常。
各包装类所具有的parseXxx()方法如下表所示:

注意:其中,parseBoolean()方法中的字符串参数取值为“True”(大小写均可)时,结果为True;否则结果为False。

(2)通过包装类的对象调用xxxValue()方法。
例如:int i = new Integer("123").intValue();
各包装类所具有的xxxValue()方法如下表2所示:

通过表2可以看出:基本数据类型间除了boolean和char类型外,都可以相互转换,并且可以将包装类对象转换为对应的基本数据类型。

written by ocean