Spark之scala
一、什么是scala
scala 是基于JVMde 编程语言。JAVA是运行在jvm上的编程语言,java 源代码通过jvm被编译成class 文件,然后在os上运行class 文件。scala是运行在jvm 上的编程语言,scala源代码通过jvm被编译成class文件,然后在os上运行class文件。
二语法:
1.声明值和变量
var a =12 // 定义变量 vary
val b = 23// 定义常量:value
2.有趣的语法特性
在scala的变量声明时,可以不指定类型,由解释器自己判断。
“superman ”*3 //表示字符串“ superman”反复输出3次
“superman ”*3 //实际上是字符串“ superman”调用方法*,传入的参数是3
3.函数:
函数在声明后,无论是否有“=”,都有返回值。当没有“=”的时候,表示返回值是Unit类型,Unit类型的值是()。当有“=”的时候,返回值是函数体中的最后一行的值。如果返回值类型强制指定为Unit类型,那么返回值必定是()。
4. 判断:
/**
* 判断if
*/
object Test21 extends App{
def judge(a:Int) :Int = {
if(a > 0){
1 //return相当于函数版的break语句
}else if(a < 0){
-1
}else{
0
}
} var c = judge(-3)
println(c)
}
5.循环
/**
* while 和 for循环
*/
object Test22 extends App{
/*while循环*/
// while(true){
// println("hello")
// } /*for循环 scala中的for基本形态*/
// for(int i = 0 ; i < 5 ; i++) //java的for循环
// for( i : List) //增强for // println(1 to 10) //Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// for(i <- 1 to 10 ){ //闭区间
// println(i)
// } // for(i <- 1 until 10 ){ //开区间
// println(i)
// } // for(i <- 1 until 10 reverse){ //倒序 不能使用 10 to 1
// println(i)
// } /*高级for循环*/
//守卫
// for(i <- 1 to 10 reverse ; if i % 3 == 0){
// println(i)
// } // for(i <- 1 to (10,3)){ //改变步长
// println(i)
// } // for(i <- 1 to 10 ; j <- 1 to 5){ //双重for循环
// println(i + " - " + j)
// } // //for的推导式
// var c = for( i <- 1 to 10 )yield (i * 2)
// println(c).csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
6.常用的数据结构
6.1数组
/**
* 数组
*/
object Test31 extends App{
/*定长数组*/
//使用new定义数组
// var arr1 = new Array[Int](5)
// arr1(1) = 2
//// println(arr1)
// for(i <- arr1){
// println(i)
// } //使用Array类进行定义
var arr2 = Array(1,2,3,4,"hehe")
// for( i <- arr2){
// println(i)
// } // println(arr2.min)
// println(arr2.max)
// println(arr2.sum)
// println(arr2.mkString("[",",","]")) //Arrays.toString(arr) [1,2,3] /*变长数组*/
// var arrbuf1 = ArrayBuffer(1,2,3,4)
// arrbuf1 += 5
// arrbuf1 -= 3
// arrbuf1 ++= Array(3,4,5)
// arrbuf1 --= Array(3,4,5)
// arrbuf1.toArray
// println(arrbuf1.mkString(",")) // var arrB = arr2.toBuffer
// arrB += 9
// println(arrB.mkString(",")) //filter 和 map用法
var arr4 = Array(1,2,3,4,5)
var arr5 = arr4.filter( _ % 2 == 0 ).map( _ * 2)
println(arr5.mkString(","))
}
6.2映射
**
* 映射
*/
object Test32 extends App{
/*不可变的映射*/
//(zhangsan,18)键值对称作对偶 用()表示
var map1 = Map[String,Int](("zhangsan" , 18) ,( "lisi" , 19))
map1 += ("wangwu" -> 80)
// map1("zhangsan") = 12
map1 += ("zhangsan" -> 20)
// println(map1("zhangsan"))
// for(i <- map1){
// println(i)
// } // if(map1.contains("zhaoliu"))
// println(map1("zhaoliu")) /*可变的映射*/
// var mapB = scala.collection.mutable.Map[String,Int]("zhangsan"->20,"lisi"->12)
// mapB("zhangsan") = 30
// for(i <- mapB){
// println(i)
// } /*与java的互操作*/
// var list = new ArrayList[Int]
// list.add(1)
// list.add(2)
//
// for(i <- 0 to list.size() - 1 ){
// println(list.get(i))
// } /*map其他遍历方式*/ // for((k,v) <- map1){ //方式一
// println(k + "->" + v)
// } //方式二
var set1 = map1.keys
var set2 = map1.keySet
for(i <- set1){
println(map1(i))
}
// println(set2).csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
6.3元祖
/**
* 元组
*/
object Test33 extends App{ //元组定义
//对偶(使用“()”表示)只是元组最简单的形式 使用()表示
var t = (1,2,3,4)
// for(i <- t){ //元组不能使用for遍历
// println(i)
// } // println(t _3) //元组的下标从1开始
// println(t _1) //元组的下标从1开始 var (first,second,third,forth) = t
// var (first,second,third,_) = t
// println(second) var s = "Hello World!"
// println(s.partition(_.isUpper)) //拉链操作
var arr1 = Array(1,2,3,4,5,6)
var arr2 = Array("a","b","c","d","e")
var arr3 = arr1.zip(arr2) //
// for(i <- arr3){
// println(i)
// }
println(arr3.mkString(","))
var map = arr3.toMap //map
for(i <- map){
println(i)
}
7.类
类的定义 :
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }使用class定义
类的字段:在类中使用var,val定义字段
类的方法:scala中,使用var定义字段默认提供setter和geter方法,对应的名称为value_= 和value.
/**
* 类的基本内容
*/ class TestClass41{
// @BeanProperty var monary = 100
var monary = 100 // def show {
// println("hello")
// }
} object Test41 extends App{ var a = new TestClass41() //实例化一个类
a.monary = 200
println(a.monary)
// println(a.show) //scala使用var定义字段 默认生成对应的setter和getter方法 对应的名称monary_= 和 monary // a setMonary 300
// println(a getMonary) //使用val定义字段的时候 scala不在提供setter方法 //@BeanProperty和private不能同时共用 }/**
* 类的基本内容2
*/
class TestClass42{
private var monary = 0 def setMonary(a:Int){ //自定义setter方法
if(a > 0)
this.monary = a
} def getMonary = { //自定义getter方法
this.monary
} } object Test42 extends App{
var c = new TestClass42
c setMonary -1000
println(c getMonary) }
构造器:
/**
* 类的构造器
*/
//class TestClass43(var name:String = "xxx" , var age:Int = 0) { //主构造器 带参数称为默认值
//
//// var name:String //需要初始化
//// var age:Int
//// public TestClass43 {} //java的构造器写法
// println("name=" + name)
// println("age=" + age)
//
//} class TestClass43 { //辅助构造器
var name:String = "lisi" //需要初始化
var age:Int = 0 def this(name:String ){
this() //辅助构造器第一行要调用主构造器
this.name = name
println("第一个辅助构造器")
} def this(name:String ,age:Int){
this(name) //还可以调用其他辅助构造器
this.name = name
this.age = age
println("第二个辅助构造器")
} println("name=" + name + " age=" + age) def show = {
"name!=" + name + " age!=" + age
}
} object Test43 extends App{
var c = new TestClass43("wangwu",90)
// println("name=" + c.name)
// println("age=" + c.age) println(c.show) }.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
8.对象
定义:Object是一种类型,与class非常相似。Object可以提供java中的静态字段、静态方法的功能。伴生对象/**
* 伴生对象
*/ class TestObject51 {
private var value = 10
def display{
println(TestObject51.value)
} def show(a:TestObject51){ //自定义getter方法
this.value = TestObject51.value
}
} /*伴生对象*/
object TestObject51{ //对象使用object定义
//该对象作为同名类的伴生对象
// private[this] var value = 10
private var value = 10 private def show {
println("超人")
}
} object Test51 extends App{ // println(TestObject51.value) //不能访问对象中的私有字段
// println(TestObject51.show) }.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }apply 方法:f(arg1,arg2,**)是函数调用方法,用着非常好用,如果f是类的实例,相当于调用类的apply()方法。/**
* apply方法
*/ object Test52 extends App{
// var arr = new Array[Int](5)
var arr = Array.apply(1,2,3,4) //构造数组使用的是apply方法 var map = Map.apply[String,Int]("zhangsan"->12) }.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
9.高阶函数
1.函数可以赋给变量值首先,在scala中,函数是一等公民2.匿名函数:函数的形式是(形参列表)=>返回值类型var ff = (s: string) => s.toUpperCaseprintln(ff)/**
* 高阶函数
*/ object Test61 extends App{
//函数定义
def add(a:Int ,b:Int) = {
a + b
}
// var c = add(1,2)
// println(c) var func1 = add _ //把一个函数的实现传递给另外一个函数
// println(func1(1,2)) // var func2 = (x :Int) => x + 3 //传递一个匿名函数给给一个变量
// var func3 = (x :Int) => {x + 3} //传递一个匿名函数给给一个变量
// var func4 = (x :Int) => (x + 3) //传递一个匿名函数给给一个变量 // for(i <- arr)
// Map[String,Int]("zhangsan" -> 12)
// println(func2(3)) // def func5(a:Int ,f:(Int)=>(Int)) = {
// f(a) + 1
// }
// println(func5(4,(x:Int) => {x + 2})) //传递一个匿名函数给该函数 //调用函数封装举例
// def CPU(a:Int) = {
// a * 8
// }
// def GPU(a:Int) = {
// a + 9
// }
// def compute(men:Int,CPU:(Int)=>(Int),GPU:(Int)=>(Int)) = {
// men + CPU(2) + GPU(2)
// }
// println(compute(4,CPU,GPU)) def func6(f:(Int)=>(Int)) = {
f(1)
}
// println(func6(_ + 2)) //简写条件:1.只有一行代码 2.只有一个形参 3.把匿名函数作为形参
// println(func6(_ + _)) //总结“_” :
// 1.代表数组每一个元素
// 2.指的是传递是确切的一个函数 而不是忘记给该函数传递参数
// 3.元组的元素取值 //思考题
// def func7 (x :Int ,y:Int) = {
// (y : Int) => {
// x + y
// } + 2
// }
// println(func7(3,4)(2)) //一些有用的函数 map foreach reduceLeft
// (1 to 9).map("*" * _).foreach(println _) var c = (1 to 3).reduceLeft(_ + _) //1 + 2 + 3
println(c) }
3. 函数作为形参(demo 同上)
对于只有一个参数的,可以只写函数体。
fun3(a=>a+2)
如果形参只有一个,可以在函数体中使用_代替。
fun3(_+2)
函数作为形参的终极版本。
4.把匿名函数放在函数体内
5.一些有用的高阶函数.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
10.继承:
抽象类
1.抽象类不一定有抽象字段,有抽象字段或者抽象方法的类一定是抽象类,只需要添加abstract关键字
2.有抽象字段一定是是抽象类(scala中字段定义时一定要初始化)
3.重写字段时实质就是在重写字段的setter/getter方法覆盖方法
非抽象类覆盖方法的时候,一定使用override。覆盖字段
抽象字段一定要有类型描述。
覆盖的时候,一定使用override。/**
* 继承--抽象类
*/ abstract class Person {
//抽象类不一定有抽象字段或者抽象方法
//有抽象字段或者抽象方法的类 一定是抽象类
var name:String
val age:Int
def story:String
} //方式一
//class Student extends Person{ //覆盖字段时实质上是覆盖了字段setter、getter方法
// var name:String = "Jeckson" //var定义的字段只能使用var覆盖,并且var覆盖只能是为实现的字段
// val age:Int = 20 //使用val定义的字段只能使用val覆盖
//// def story = "dance" //
// def story = "dance" //使用def定义的抽象方法可以使用def覆盖也可以使用val ,当def为无参时函数可以使用val
//} //方式二
//class Student (var name:String = "Jeckson" ,val age:Int = 20 ,val story:String = "dance") extends Person object Test71 extends App{
// var c = new Student
// println(c.name)
// println(c.age)
// println(c.story) var c = new Person { //方式三 匿名子类
var name:String = "Jeckson" //var定义的字段只能使用var覆盖,并且var覆盖只能是为实现的字段
val age:Int = 20 //使用val定义的字段只能使用val覆盖
def story = "dance" //
}
}
匿名子类重写超类
抽象字段和抽象方法
/**
* 构造顺序
*/
class Person1 {
val age:Int = 10
var arr:Array[Int] = new Array[Int](age) //调age字段的getter方法
} //class student1 extends Person1{
// override lazy val age:Int = 18 //如果覆盖的父类不是抽象类 必须要写override
//} class student1 extends { //解决办法③
override val age:Int = 18 //如果覆盖的父类不是抽象类 必须要写override
} with Person1 //特质
/*trait student2 {
var a:Int = 10
var b:Int
}
trait student3{
def show = "123"
}
class student4 extends student2 with student3{
var b:Int = 1
}*/ object Test72 extends App{
var c = new student1
println(c.age)
println(c.arr.length)
//输出18 0 解决办法:1.字段前面添加final 2.字段前面添加lazy 3.解决办法③
//原因:
// a.主构造器和class类交织在一起
// b.子类中使用了override覆盖超类中的字段,构造子类时超类的字段值会被覆盖
// c.student1类作为student1的主构造器,调用了超类的Person1的主构造器
// d.首先,构造器将age值设置为10
// e.接着代码往下走,为了初始化arr数组,调用了age的getter方法
// f.而age字段被重写了,也就是说getter方法被重写了
// g.被重写的getter方法还没有被初始化,确切说就是字段age还是对象在被分配空间时所有整型字段的初始值
// h.arr数组长度被设置为0
// i.子类Student1类构造器执行,age被赋值为18
}.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
10 .模式匹配
更好的switch case
object Test73 extends App{
// var t = (1,2,3)
// var (first,second,third) = t //模式匹配
// println(first) var s = "++" var result = s match {
case "a" => println("超人")
case "*" => 1
case "牛人" => "superman"
case _ if s.contains("=") => (x:Int) => {x + 1}
case _ => 0
} println(result)
}.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
仅此献给努力的你我。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Spark之scala的更多相关文章
- eclipse创建maven管理Spark的scala
说明,由于spark是用scala写的.因此,不管是在看源码还是在写spark有关的代码的时候,都最好是用scala.那么作为一个程序员首先是必须要把手中的宝剑给磨砺了.那就是创建好编写scala的代 ...
- java+hadoop+spark+hbase+scala+kafka+zookeeper配置环境变量记录备忘
java+hadoop+spark+hbase+scala 在/etc/profile 下面加上如下环境变量 export JAVA_HOME=/usr/java/jdk1.8.0_102 expor ...
- 机器学习的Spark与Scala开发简介
一.机器学习常用开发软件:Spark.Scala 1. Spark简介: MLlib包含的库文件有: 分类 降维 回归 聚类 推荐系统 自然语言处理 在线学习 统计学习方法:偏向理论性,数理统计的方 ...
- Spark之Scala学习
1. Scala集合学习: http://blog.csdn.net/lyrebing/article/details/20362227 2. scala实现kmeans算法 http://www.t ...
- spark与Scala安装过程和步骤及sparkshell命令的使用
Spark与Scala版本兼容问题: Spark运行在Java 8 +,Python 2.7 + / 3.4 +和R 3.1+上.对于Scala API,Spark 2.4.2使用Scala 2.12 ...
- 关于spark与scala版本问题记录
记录一下版本问题: spark与scala版本对应问题: 1.官网会给出,如下,spark2.3.1默认需要scala2.11版本 2.在maven依赖网中也可以看到,如下 3.关于idea开发版本中 ...
- spark与Scala版本对应问题
在阅读一些博客和资料中,发现安装spark与Scala是要严格遵守两者的版本对应关系,如果版本不对应会在之后的使用中出现许多问题. 在安装时,我们可以在spark的官网中查到对应的Scala版本号,如 ...
- Spark&Hadoop:scala编写spark任务jar包,运行无法识别main函数,怎么办?
昨晚和同事一起看一个scala写的程序,程序都写完了,且在idea上debug运行是ok的.但我们不能调试的方式部署在客户机器上,于是打包吧.打包时,我们是采用把外部引入的五个包(spark-asse ...
- Mac 配置Spark环境scala+python版本(Spark1.6.0)
1. 从官网下载Spark安装包,解压到自己的安装目录下(默认已经安装好JDK,JDK安装可自行查找): spark官网:http://spark.apache.org/downloads.html ...
- spark als scala实现(二)
Vi t1.txt1,101,5.01,102,3.01,103,2.52,101,2.02,102,2.52,103,5.02,104,2.03,101,2.53,104,4.03,105,4.5 ...
随机推荐
- 《JavaScript权威指南》学习笔记 第三天 找个对象
现实生活中真的对象没有找到,在JavaScript 里左一个对象又一个对象,搞的我也是晕晕乎乎不知所云.人事复杂,人心难懂.我虽然是文科生,但是也不善于巧言.还是在js里面找找对象吧.那么我们今天就从 ...
- POJ2187Beauty Contest(任意点的最远距离 + 凸包)
题目链接 题意:就是给N个点的坐标,然后求任意两个点距离的平方最大的值 枚举超时. 当明白了 最远距离的两个点一定在凸包上,一切就好办了.求出凸包,然后枚举 #include <iostream ...
- 将maven工程转成dynamic web project
http://blog.csdn.net/remote_roamer/article/details/51724378 做到最后一步就不行鸟,没有plugin........
- 符号(void *)何解?符号(void **)又何解??
http://bbs.csdn.net/topics/70050852 对于多级指针或者数组,要掌握正确的识别方法:void* 是说: 这是一个指针,去掉一个(*)就是它所指向的,在这里是指向放vo ...
- BZOJ4004: [JLOI2015]装备购买
总之就是线性基那一套贪心理论直接做就好了. 然而加强数据后很卡精度的样子. 于是重点在于这个特技:在整数模意义下搞. #include<cstdio> #include<algori ...
- NumberFormat类
NumberFormat表示数字的格式化类,即可以按照本地的风格习惯进行数字的显示. NumberFormat是一个抽象类,和MessageFormat类一样,都是Format类的子类,本类在使用时可 ...
- Tomcat 开发web项目报Illegal access: this web application instance has been stopped already. Could not load [org.apache.commons.pool.impl.CursorableLinkedList$Cursor]. 错误
开发Java web项目,在tomcat运行后报如下错误: Illegal access: this web application instance has been stopped already ...
- 负margin小记
static元素 margin-top/left负值,元素向指定方向移动, margin-bottom/right负值,元素不动,后续元素前移 float元素 左浮, ...
- python字符类型的一些方法
python 字符串和字节互转换.bytes(s, encoding = "utf8") str(b, encoding = "utf-8") i.isspac ...
- 深入理解Spring Redis的使用 (一)、Spring Redis基本使用
关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...