1. 净资产应用实例

我们要构建这样一个应用,它会取回一份列表,其中包括用户持有的股票的代码以及股份,并告知他们在当前日期为止的这些投资的总价。这包含了几件事:获取用户输入、读文件、解析数据、写文件、从Web获取数据、把信息显示给用户。

我们会先开发一个控制台应用。然后,把它转换成Swing应用。一次一步,沿着这条路重构应用。

2. 获取用户输入

Scala的Console类可以从命令行获取用户输入。

下面的代码将信息读入内存:

package com.cn.gao
//获取用户输入
class ConsoleInput {
print("Please enter a tiker symbol:")
val symbol = Console.readLine
//val symbol = readLine //This will work too
println("OK, got it, you own " + symbol)
}
//object ConsoleInput extends App{
// new ConsoleInput()
//}

程序运行结果如下:

Please enter a tiker symbol:AAPL
OK, got it, you own AAPL

3. 读写文件

用java.io.File可以做这件事。下面是个写文件的例子:

package com.cn.gao
import java.io._
//写文件
class WriteToFile {
val writer = new PrintWriter(new File("D:\\symbols.txt"))
writer write "AAPL"
writer.close()
} //object WriteToFile extends App{
// new WriteToFile()
//}

上面的这段代码将股票代码"AAPL"写入到文件D:\\symbols.txt里。文件内容如下:

AAPL

读文件写真的很简单。Scala的Source类及其伴生对象就是为这种目的而存在的。为了演示,我们写了一个Scala脚本:

package com.cn.gao
import scala.io.Source
/**
* 读文件
*/
class ReadingFile {
println("请输入你要读出的文件完整路径:")
val name = readLine //或者Console.readLine
Source.fromFile(name).foreach(print)
} object ReadingFile extends App{
new ReadingFile()
}

在上面的代码里,读取了相应的文件,打印出其内容如下所示:

请输入你要读出的文件完整路径:
D://data.txt
linux的特点
1.免费的/开源
2.支持多线程./多用户的
3.安全性好
4.对内存和文件管理优越. linux最小只需要4m->嵌入式开发
samba服务器用于和windows进行交互
从事网络开发必读三本书:
TCP/ip详解,协议
实现
TCP事务协议 http nntp和UNIX域协议
tracert 目标ip/域名 查看经过的网关数目(追踪路由)
ping 目标ip 测试两个ip是否畅通
1.在windows中查看ip情况的命令是ipconfig
2.在linux/unix下查看ip命令是ifconfig
linux网络环境配置
第一种方法:
(1)用root身份登录,运行setup命令进入到text mode setup utiliy对
网络进行配置。这里可以进行ip,子网掩码,默认网关,dns的设置。
(2)这时网卡配置没有生效,运行/etc/rc.d/init.d/network restart命
令我们刚才作的设置生效
第二种方法:
(1)ifconfig eth0 x.x.x.x对网卡进行设置
(2)ifconfig eth0 network x.x.x.x对子网掩码设置
对广播地址和dns使用默认的。
注意:这样配置网络将会立即生效,但是是临时生效。
第三种方法:
(1)修改/etc/sysconfig/network-scripts/ifconfig-eth0这个文件里各个
属性可以修改,包括ip,子网掩码,广播地址,默认网关。
(2)这时网卡的配置没有生效,运行/etc/rc.d/init.d/network restart
命令我们刚才作的设置才生效。
这种方法是最底层的修改方法
samba的安装步骤
a.看看是否已经安装了samba
rpm -q samba
b.如有,如何卸载
rpm -e samba
rpm -e --nodeps samba http://blog.csdn.net/eric491179912/article/details/6179908

Source类是一个输入流上的Iterator。Source的伴生对象有几个便利方法去读文件、输入流、字符串甚至是URL,稍后会看到。foreach()方法一次读取一个字符(输入是缓冲的,不必担心性能)。如果需要一次读一行,那就用getLines()方法。

很快我们就会从Web读信息了。因此,讨论Source时,让我们看看它的fromURL()方法。这个方法可以读取网站、web服务或是任何可以用URL指向东西的内容。下面是个例子,读入Scala文档站点,确定文档相关的Scala版本号:

package com.cn.gao
import scala.io.Source
import java.net.URL
/**
* 从Web读取信息
*/
class ReadingURL {
val source = Source.fromURL(
new URL("http://www.scala-lang.org/docu/files/api/index.html")) println(source.getLine(3))
val content = source.mkString
val VersionRegEx = """[\D\S]+scaladoc\s+\(version\s+(.+)\)[\D\S]+""".r
content match {
case VersionRegEx(version) => println("Scala doc for version: " + version)
}
} object ReadingURL extends App{
new ReadingURL()
}

上面的代码调用fromURL()获得Source实例,这样,就可以从URL读取内容,然后进行迭代。将3传入getLine()方法,读取第三行。使用这个方法必须小心谨慎。索引值从1开始,而不是0,所以,第一行实际上是用索引1引用的。

4. XML,作为一等公民

Scala把XML当作一等公民。因此,不必把XML文档嵌入字符串,直接放入代码即可,就像放一个int或Double值一样。看个例子:

package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
println(xmlFragment)
println(xmlFragment.getClass())
} object UseXML extends App {
new UseXML()
}

这里创建了一个val,叫做xmlFragment,直接把一些XML样例内容赋给它。Scala解析了XML的内容,欣然创建了一个scala.xml.Elem的实例,输出如下:

<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
class scala.xml.Elem

Scala的scala.xml包提供了一些类,用以读取、解析、创建和存储XML文档。

你或许用过XPath,它提供了一种强大的查询XML文档的方式。Scala提供了一种类似XPath的查询能力,但略有差异。对于辅助解析和提取的方法,Scala不用斜线(/和//)查询,而用反斜线(\和\\)。这个差异是必需的,因为Scala遵循Java的传统,使用两个斜线表示注释。这样,我们看一下如何解析手头上的这个XML片段。

首先,要获取symbol这个元素。为了做到这一点,可以使用类似XPath的查询,如下:

package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass())
var symbolNodes = xmlFragment \ "symbol"
println(symbolNodes.mkString("\n"))
println(symbolNodes.getClass())
} object UseXML extends App {
new UseXML()
}

上面的代码的输出如下:

<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
class scala.xml.NodeSeq$$anon$1

这里调用了XML元素的\()方法,让它找到所有symbol元素。它会返回一个scala.xml.NodeSeq的实例,表示XML节点的集合。

\()方法只会找出是目标元素(本例子里是symbols元素)直接后代的元素。如果想从目标元素出发,搜出层次结构里所有的元素,就要用\\()方法,如下所示。此外,用text()方法可以获取元素里的文本节点。

package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass()) // var symbolNodes = xmlFragment \ "symbol"
// println(symbolNodes.mkString("\n"))
// println(symbolNodes.getClass()) var unitsNodes = xmlFragment \\ "units"
println(unitsNodes.mkString("\n"))
println(unitsNodes.getClass())
println(unitsNodes(0).text)
} object UseXML extends App {
new UseXML()
}

上面的代码的输出如下:

<units>200</units>
<units>215</units>
class scala.xml.NodeSeq$$anon$1
200

在上面的例子里,使用了text()方法去获取文本节点。模式匹配也可以获取文本值以及其他内容。如果想浏览XML文档的结构,\()和\\()两个方法很有用。不过,如果想匹配XML文档任意位置的内容,模式匹配会显得更有用。

Scala也将模式匹配扩展到了XML片段的匹配上,如下所示:

package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass()) // var symbolNodes = xmlFragment \ "symbol"
// println(symbolNodes.mkString("\n"))
// println(symbolNodes.getClass()) var unitsNodes = xmlFragment \\ "units"
// println(unitsNodes.mkString("\n"))
// println(unitsNodes.getClass())
// println(unitsNodes(0).text) unitsNodes(0) match {
case <units>{numberOfUnits}</units> => println("Units: " + numberOfUnits)
}
} object UseXML extends App {
new UseXML()
}

上面代码的输出如下:

Units: 200

这里,取出第一个units元素,让Scala提取出文本值200。在case语句里,我们对感兴趣的片段进行匹配,用一个变量numberOfUnits,当做这个元素的文本内容的占位符。

这样就可以获取到一支股票的股份了。不过还是有两个问题。前一种方式只对内容刚好匹配case里表达式的情况起作用;也就是说,units元素只能包含一个内容项或是一个子元素。如果它包含的是子元素和文本内容的混合体,上面的匹配就会失败。而且这里想得到的是所有股票的股份,而不是第一个。运用_*,就可以让Scala抓出所有的内容(元素和文本),如下所示:

package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass()) // var symbolNodes = xmlFragment \ "symbol"
// println(symbolNodes.mkString("\n"))
// println(symbolNodes.getClass()) var unitsNodes = xmlFragment \\ "units"
// println(unitsNodes.mkString("\n"))
// println(unitsNodes.getClass())
// println(unitsNodes(0).text) // unitsNodes(0) match {
// case <units>{numberOfUnits}</units> => println("Units: " + numberOfUnits)
// } println("Ticker\tUnits")
xmlFragment match {
case <symbols>{symbolNodes @ _*}</symbols> =>
for(symbolNode @ <symbol>{_*}</symbol> <- symbolNodes){
println("%-7s %s".format(
symbolNode \ "@ticker", (symbolNode \ "units").text)) //用@前缀表示属性查询
}
}
} object UseXML extends App {
new UseXML()
}

上面代码的输出如下:

Ticker    Units
AAPL 200
IBM 215

5. 读写XML

只有将XML读入内存,才能够进行解析。下一步,我们来了解如何将XML文档加载到程序里,如何把内存里的文档存入文件。作为例子,我们会加载一个包含股票代码和股份的文件,对股份加1,然后将更新的内容存回到另一个XML文件里。我们先来处理加载文件的这一步。

这是要加载的样例文件stocks.xml:

<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="ADBE"><units>125</units></symbol>
<symbol ticker="ALU"><units>150</units></symbol>
<symbol ticker="AMD"><units>150</units></symbol>
<symbol ticker="CSCO"><units>250</units></symbol>
<symbol ticker="HPQ"><units>225</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
<symbol ticker="INTC"><units>160</units></symbol>
<symbol ticker="MSFT"><units>190</units></symbol>
<symbol ticker="NSM"><units>200</units></symbol>
<symbol ticker="ORCL"><units>200</units></symbol>
<symbol ticker="SYMC"><units>230</units></symbol>
<symbol ticker="TXN"><units>190</units></symbol>
<symbol ticker="VRSN"><units>200</units></symbol>
<symbol ticker="XRX"><units>240</units></symbol>
</symbols>

scala.xml的XML单例对象的load()方法可以辅助加载文件,如下所示:

package com.cn.gao
import scala.xml._
class ReadWriteXML {
val stocksAndUnits = XML.load("D:\\stocks.xml")
println(stocksAndUnits.getClass())
println("Loaded file has " + (stocksAndUnits \\ "symbol").size +
" symbol elements")
} object ReadWriteXML extends App {
new ReadWriteXML()
}

从下面的输出可以看出,load()返回的是一个scala.xml.Elem实例。此外还可以看到,加载的文件(stocks.xml)包含15个symbol元素。

class scala.xml.Elem
Loaded file has 15 symbol elements

我们已经知道如何解析这个文档的内容,下面将股票代码以及其对应的股份存到Map里。下面这段代码做的就是这件事:

package com.cn.gao
import scala.collection.mutable._
import scala.xml._
class ReadWriteXML {
val stocksAndUnits = XML.load("D:\\stocks.xml")
// println(stocksAndUnits.getClass())
// println("Loaded file has " + (stocksAndUnits \\ "symbol").size +
// " symbol elements") val stocksAndUnitsMap =
(Map[String, Int]() /: (stocksAndUnits \ "symbol")) {(map, symbolNode) =>
val ticker = (symbolNode \ "@ticker").toString
val units = (symbolNode \ "units").text.toInt
map(ticker) = units //Creates and returns a new Map
}
println("Number of symbol elements found is " + stocksAndUnitsMap.size)
} object ReadWriteXML extends App {
new ReadWriteXML()
}

最后一步,增加股份值,创建数据的XML表示,存入文件。

package com.cn.gao
import scala.collection.mutable._
import scala.xml._
class ReadWriteXML {
val stocksAndUnits = XML.load("D:\\stocks.xml")
// println(stocksAndUnits.getClass())
// println("Loaded file has " + (stocksAndUnits \\ "symbol").size +
// " symbol elements") val stocksAndUnitsMap =
(Map[String, Int]() /: (stocksAndUnits \ "symbol")) {(map, symbolNode) =>
val ticker = (symbolNode \ "@ticker").toString
val units = (symbolNode \ "units").text.toInt
map(ticker) = units //Creates and returns a new Map
}
println("Number of symbol elements found is " + stocksAndUnitsMap.size) val updatedStocksAndUnitsXML =
<symbols>
{ stocksAndUnitsMap.map{ updateUnitsAndCreateXML }}
</symbols> def updateUnitsAndCreateXML(element : (String, Int))= {
val (ticker, units) = element
<symbol ticker={ticker}>
<units>{units + 1}</units>
</symbol>
} XML save ("D:\\stocks2.xml", updatedStocksAndUnitsXML)
println("The saved file contains " +
(XML.load("D:\\stocks2.xml") \\ "symbol").size = " symbol elements")
} object ReadWriteXML extends App {
new ReadWriteXML()
}

6. GUI使用示例

package com.cn.gao
import scala.swing._
import event._
object SampleGUI extends SimpleSwingApplication {
def top = new MainFrame {
title = "A Sample Scala Swing GUI" val label = new Label {text = "------------"}
val button = new Button { text = "Click me"} contents = new FlowPanel {
contents += label
contents += button
} listenTo(button) reactions += {
case ButtonClicked(button) =>
label.text = "You clicked!"
}
}
}

使用Scala的更多相关文章

  1. jdb调试scala代码的简单介绍

    在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...

  2. scala练习题1 基础知识

    1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等:     2,在scala REPL中,计算3的平方根,然 ...

  3. 牛顿法求平方根 scala

    你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...

  4. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  5. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  6. Scala快速概览

    IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...

  7. Scala Macros - scalamela 1.x,inline-meta annotations

    在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...

  8. Scala Macros - 元编程 Metaprogramming with Def Macros

    Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...

  9. Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...

  10. Scala For Java的一些参考

          变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...

随机推荐

  1. Java学习笔记之:Struts2.0 环境搭建

    一.介绍 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. 二 ...

  2. caffe fine tune 复制预训练model的参数和freeze指定层参数

    复制预训练model的参数,只需要重新copy一个train_val.prototxt.然后把不需要复制的层的名字改一下,如(fc7 -> fc7_new),然后fine tune即可. fre ...

  3. vector 邻接表的建立(好笨啊,才懂,可能太困了吧)。。

    原创,未经允许不得转载. 图的建立有两种,邻接矩阵和邻接表. 邻接矩阵适用于图较为密集,(稀疏图太浪费存储空间了),图如果较为稀疏,则使用邻接表为宜,dijkstra算法就是以邻接表为基础的. 有向无 ...

  4. UVA - 11995 - I Can Guess the Data Structure! STL 模拟

    There is a bag-like data structure, supporting two operations: 1 x Throw an element x into the bag. ...

  5. ASP.NET MVC 提高运行速度的几种性能优化方法

    主要介绍ASP.NETMVC 应用提速的六种方法,因为没有人喜欢等待,所以介绍几种常用的优化方法. 大家可能会遇到排队等待,遇到红灯要等待,开个网页要等待,等等等. 理所当然,没有人喜欢等待网页慢吞吞 ...

  6. Python字典使用--词频统计的GUI实现

    字典是针对非序列集合而提供的一种数据类型,字典中的数据是无序排列的. 字典的操作 为字典增加一项 dict[key] = value students = {"Z004":&quo ...

  7. 【BFS】【最小生成树】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem G. We Need More Managers!

    题意:给你n个点,点带权,任意两点之间的边权是它们的点权的异或值中“1”的个数,问你该图的最小生成树. 看似是个完全图,实际上有很多边是废的.类似……卡诺图的思想?从读入的点出发BFS,每次只到改变它 ...

  8. 502 解决:[WARNING] fpm_children_bury

    查过网上的资源,基本都是认为是php线程打开文件句柄受限导致的错误.具体的解决的办法如下:   1.提升服务器的文件句柄打开打开 /etc/security/limits.conf : (增加) * ...

  9. 证明 O(n/1+n/2+…+n/n)=O(nlogn)

    前言 在算法中,经常需要用到一种与调和级数有关的方法求解,在分析该方法的复杂度时,我们会经常得到\(O(\frac{n}{1}+\frac{n}{2}+\ldots+\frac{n}{n})\)的复杂 ...

  10. 一行代码提取url中querystring的某个key的值

    var itemdata = "OrderFilter=0&ProjectTag=15&DateType=0"; var projectTag = itemdata ...