`
leon1509
  • 浏览: 544684 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Groovy 浅入

阅读更多
转贴地址:http://nottiansyf.iteye.com/blog/348077

本文只适合ctrl+F查找,不建议全文阅读


需要将bin路径加入到Path中,然后建立Groovy_Path 设置相应的文件路径

groovyConsole用于简单的进行运行Groovy语言的程序

和Spring整合,可以正常的和Spring进行注解的注入

定义方法和声明一个对象的时候 都可以使用def关键字

使用Groovy重构Java代码 减少代码的冗余

重构JavaBean
方便的重写ToString()方法 在字符串""中使用{属性名} 就可以简单的设置值. {}符号可有可无
def orz="hello orz";
println "orz -- ${orz}";

Groovy会自动的对下面的属性进行Get和Set方法的定义
String manufacturer;
因为 Groovy 的默认属性语义用 public 访问器和存取器自动定义了 private 域
如果需要详细的get或者set的设置, 也可以使用public void setXXX(){}进行自定义
使用protected 等修饰符进行get或者set方法作用域的屏蔽

定律:使普通的编码规则变得简单。

也可以使用 def 关键字来代替特定的类型。

内置的测试,需要继承GroovyTestCase类
然后使用assert 属性==目标 这样进行测试

同样这样的构造函数也是可以动态添加的....注意使用name: 中的:进行属性的复制
def h=new HelloGroovy(name:"tom",age:100,desc:"orz");

Grooving 中使用多态

集合的使用
List ls=[] 声明一个集合,无需导入包
ls << "List1" 给集合添加一个对象 然后可以.size()判断大小

集合中查找
def getBike(serialNo) { bikes.find{it.serialNo == serialNo} }
定义一个方法,传入一个条件进行查询

循环一个集合
ls.each{println it}; 注意使用大括号{}  也可以使用ls.each{e -> println e} 进行代替操作

Map的键值对集合 使用:分别对应
scores = [ "Brett":100, "Pete":"Did not finish", "Andrew":86.87934 ]
println scores["Pete"]
println scores.Pete
创建空集合的方法
emptyMap = [:]
emptyList = []

在Groovy中加载Spring的上下文ApplicationContext
def ctx = new ClassPathXmlApplicationContext("RentABike-context.xml")
def clv = ctx.getBean("commandLineView")
  clv.printAllBikes()
也可以使用注解的注入

读取文件的例子
import java.io.File
new File("maven.xml").eachLine{ line ->
  println "read the following line -> " + line
}
定义一个文件: def nfile = ["c:/dev", "newfile.txt"] as File
..符号的使用
myInclusiveRange = 2..5  
其中2..<5 表示2..4

类似Ruby的操作
5.times{println it};

快速的定义个方法
def squ={it * it}
def void testClosures()
{
println(squ(3));
}
注意it是当前对象的引用,这里指的是值,即传入的参数.
另外种用法
[ 1, 2, 3, 4 ].collect(square) 表示将每个参数分别传入该方法 并进行处理
不过并不会影响到源对象

对键值对的处理
printMapClosure = { key, value -> println key + "=" + value }
[ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)

这个就叫做闭包  关键字用it ,以及key和value
就是生成个函数,然后作为参数传入进行迭代, 用的比较多的地方

声明正则的方式 /字符串/
==~ 进行正则的测试. 类似test方法,返回一个boolean值
正则分组
myRegularExpression = /([a-zA-Z]+), ([a-zA-Z]+): ([0-9]+)/
matcher = ( locationData =~ myRegularExpression )
得到结果
matcher[0][1] 注意这里使用二维数组使用

Groovy SQL
${} 用一个字符串表达一个groovy expression
就是将代码嵌入到字符串中运行

连接数据库的方法
import groovy.sql.Sql
Sql sql = Sql.newInstance("jdbc:mysql://127.0.0.1:3306/demo","root","123","com.mysql.jdbc.Driver")
sql.eachRow("select * from tableName", { println it.id + " -- ${it.firstName} --"} );
sql.close();

这里的Sql类型声明 可以使用def代替
方法前的def可以不写

SQL参数的赋值操作
sql.execute("insert into people (firstName, lastName) "+
  " values (?,?)", [firstName, lastName])

创建Groovy的Servlet-----Groovlets

配置方式
<servlet>
<servlet-name>Groovy</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Groovy</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>

其中的代码部分
if (!session) {
  session = request.getSession(true);
}

if (!session.counter) {
  session.counter = 1
}

println """
<html>
    <head>
        <title>Groovy Servlet</title>
    </head>
    <body>
Hello, ${request.remoteHost}: ${session.counter}! ${new Date()}
    </body>
</html>
"""
session.counter = session.counter + 1


模板 使用$ 用于生成自定的字符串
import groovy.text.SimpleTemplateEngine

def text = 'Dear "$firstname $lastname",\nSo nice to meet you in <% print city %>.\nSee you in ${month},\n${signed}'

def binding = ["firstname":"Sam", "lastname":"Pullara", "city":"San Francisco", "month":"December", "signed":"Groovy-Dev"]

def engine = new SimpleTemplateEngine()
template = engine.createTemplate(text).make(binding)


as 关键字 类似ActionScript中的类型转换

** 表示平凡运算

.class用于得到指定对象的类型 比如x.class


时间类型
def today = new Date() 声明当前时间
def tomorrow = today + 1 增加一天 ...同样可以减去多天或者一天 plus()表示+ minus()表示减
可以方便的使用
tomorrow.after(today) 进行boolean值的判断
tomorrow.compareTo(today) > 0 功能一样

还有另外种日历类型,暂时省略

Collections 集合类型的时候

定义一个简单的集合
def list = [5, 6, 7, 8] 默认类型是.class为ArrayList
list.set(2, 11) 体会第2索引下的值为11 并返回原来位置的值
[1,2,3,4,5][-1] == 5 反向的读取值
[1,2,3,4,5].getAt(-2) == 4 等同与上面的方法

搜索集合里面的指定值
[1,2,3,4,5].get(-2)  返回0 表示没有找到

[12,3] << 3 直接给集合添加对象
要注意添加一个[]集合给list的时候,不会自动拆包

其他的添加集合的方法
使用+ 或者+=
[1,2] + 3 + [4,5] + 6 == [1, 2, 3, 4, 5, 6]
def a= [1,2,3]; a += 4; a += [5,6]; assert a == [1,2,3,4,5,6]

集合中可以存放不同的类型对象或者值对象
collect方法 用于循环值进行更新,当不修改源对象
[1, 2, 3].collect{ it * 2 } == [2, 4, 6]
也可以直接放入一个对象进行接受返回的直接
def list= []
[1, 2, 3].collect( list ){ it * 2 } == [2, 4, 6]
list=[2,4,6]

集合中的查询, 默认都只返回值
find{it>1} 查询第一个符合条件的结果
findall{it>1}查询所有的结果,并返回
findIndexOf{it in ["c","b"]} 查询在指定集合内的首个索引

条件搜索 every和any
[1,2,3].every{it < 5} 返回true
! [1, 2, 3].every{ it < 3 }
[1, 2, 3].any{ it > 2 }
! [1, 2, 3].any{ it > 3 }

计算集合内的总和
[1,2,3,4,5,6].sum() == 21
可以使用sum{ it=='a'?1: it=='b'?2:} 进行判断后返回值,加入逻辑的使用
字符串的话也会拼接在一起
如果是两个子List,那么会合并成一个List

带参数的Sum 会进行+参数的运算
[1, 2, 3].sum(1000) == 1006
参数的传递,会在{}里面增加一个引用,就是多一个it类型

list.max()  .min() 可以很方便的进行最大小的判断
也可以使用Collections.max( list ) == 10
同样也可以作用在'' 的char类型之上

可以通过it闭包的方式进行更详细的判断
def list2= ['abc', 'z', 'xyzuvw', 'Hello', '321']
list2.max{ it.size() } == 'xyzuvw'
list2.min{ it.size() } == 'z'

运算符的重载
def mc= [compare:{a,b-> a.equals(b)? 0: a<b? -1: 1}] as Comparator
同时可能返回三个结果 0,-1,1

这样就可以直接使用来判断指定大小值,需要将mc作为参数进行传递
def list= [7,4,9,-6,-1,11,2,3,-9,5,-13]
list.max( mc ) == 11
Collections.max( list, mc ) == 11

从List中移除一个对象
['a','b','c','b','b'] - 'c' == ['a','b','b','b']
注意这种移除会移除所有符合条件的对象
['a','b','c','b','b'] - 'b' == ['a','c']
传入一个List用于移除多个
['a','b','c','b','b'] - ['b','c'] == ['a']
minus()方法 起到同样的作用
['a','b','c','b','b'].minus( ['b','c'] ) == ['a']

其他移除的方法
def list= [1,2,3,4,3,2,1]
list -= 3
list == [1,2,4,2,1]
这样会移除所有的3,传入数组也有同样的目的

list.remove(2) 移除指定的索引,并返回被移除的对象
当如果Remove的不是一个数字的时候,将返回boolean值,来判断是否移除成功

list[1..5] 可以使用这种方式方便的截取集合,不过这里获取了一个引用,对截取集合的修改,也会影响到源集合

使用*符号可以很方便的遍历集合

?: 三目操作符

Groovy是实现内部领域特定语言(Domain-Specific Languages)的理想选择

list.clear()方法用于清空集合

判断一个对象是否在集合里面的方法
'a' in ['a','b','c']
['a','b','c'].contains('a')
[1,3,4].containsAll([1,4])

判断对象是否为空
list.isEmpty();

判断对象重复的次数
[1,2,3,3,3,3,4,5].count(3) == 4

判断集合比较重复的对象 交集
[1,2,4,6,8,10,12].intersect([1,3,6,9,12]) == [1,6,12]

判断集合不重复 并集
[1,2,3].disjoint( [4,6,9] )

排序 .sort()方法

自定义排序的方式  闭包的方式
list.sort{ it.size() } == ['z', 'abc', '321', 'Hello', 'xyzuvw']

复杂的排序
list2.sort{a,b-> a.equals(b)? 0: Math.abs(a)<Math.abs(b)? -1: 1 } == [-1, 2, 3, 4, 5, -6, 7, -9, 11, -13]

使用Comparator方式排序
def mc= [
  compare: {a,b-> a.equals(b)? 0: Math.abs(a)<Math.abs(b)? -1: 1 }
] as Comparator
assert list2.sort(mc) == [-1, 2, 3, 4, 5, -6, 7, -9, 11, -13]

Collections.sort(list3) 也提供了集合类的操作

indexOf()和lastIndexOf() 用于判断该元素的位置, -1表示不存在

取出指定区间的集合,使用索引
('a'..'g')[ 1, 3, 5, 6 ] == ['b','d','f','g']

截取集合中指定的对象
list.retainAll( ['a','e'] )

2进制的操作
Collections.binarySearch([2,5,6,7,9,11,13,26,31,33], 26) == 7

Set的使用
定义一个Set  默认为HashSet类型
def s1= [1,2,3,3,3,4] as Set,

s1.asList() 转换成List 或者toList()方法

数组Array的定义 使用new Object[length]

def a= new Object[4]
同样可以添加不同类型的对象
生成字符串
a.toArrayString() == '{"a", 2, "c", false}'

使用toList()转换成List

多维数组的使用
i= 4
a= new Object[i][i=3]    ==Object[4][3]

Map的使用 键值对的形式  其中Key不能重复,会被自动忽略掉,后面的覆盖掉前面的
def map= ['id':'FX-11', 'name':'Radish', 'no':1234, 99:'Y']

map2.class == null  这里不能使用class获取类型
ap2.getClass() == LinkedHashMap 需要使用这种方法




声明一个空的Map
def map4= [:]

特殊类型的key似乎需要用()包装起来 比如 true false 以及负数,也可以使用null 不过在写的时候也需要使用()

Stringbuffer也可以使用<<进行内容的增加

Characters 类型 区别与String 用'' 而不是"" 长度为16

Strings 类型 字符串 ,包含了Characters
'hello, world' == "hello, world"

"Hello, Groovy's world" == 'Hello, Groovy\'s world'  在character中'需要转译

'''hello,
world''' == 'hello,\nworld' 用''' 表示完整的''类型

$在字符串用来引用变量
7.5d.toString() 方法,不同与Java的方法,返回的也是其类型

s1.codePointAt(3) == 0x10000 返回指定索引位置的字符串的Character字节码

正则的使用

'\07\013\033' ==~ /\a\v\e/  这里会转换成对应的字符 然后进行比较
也可以调用变量进行转换后比较
"${0x1d as char}" =~ /\c]/

'gOoDbYe' ==~ /(?i)goodbye/  表示忽略大小写进行比较
(?x) 表示忽略空格
'abCDefg' ==~ /ab(?i)cd(?-i)efg/ 表示只对一部分忽略大小写
'abCDEfg' ==~ /ab(?i:cde)fg/ 作用同上

'abcdefg' ==~ /(?ix) a b c (?s-ix)defg/ 忽略空格的用法和i基本一样

[]表示多选一  ()表示同时出现

分组查询
def m= java.util.regex.Pattern.compile( /(.*),(.*)/ ).matcher( 'one,two,three' )
m.matches()
m.group(1) == 'one,two'

长字符的比较
import java.util.regex.Pattern
m= Pattern.compile( /(a+)(b+)/ ).matcher( 'aaabbcccaabbb' )
可以使用m.start(2) == 3  m.end(2) 等方法进行访问


使用=~进行方便的匹配
('tone, true, tame, tape, take, tile, time' =~ /t..e/).find{ it[1] == 'a' } == 'tame'

('abcdefg' =~ /bcd|bcdef/)[0] == 'bcd'

贪婪匹配和非贪婪匹配  (区别于结果是否马上返回)
('Friday 13th' =~ /Fri(day)??/)[0][0] == 'Fri'  非贪婪
eachMatch( /".*?"/  为贪婪时匹配

分组例子
def m= ( ~/(.*),(.*)/ ).matcher( 'one,two,three' )
assert m.matches() && m.group(1) == 'one,two' && m.group(2) == 'three'


File类的使用
\符号和:符号的替代  这点和Java一样,为了跨平台
File.separator == '\\'
File.pathSeparator == ':'

声明一个文件
def f= new File('File.txt')

f.absolutePath 文件的完整地址

f.toURI().toString() == 'file:/D:/Groovy/Scripts/File.txt'  用URL的方式返回地址
f.canonicalPath  表示文件可访问的地址

f2.createNewFile() 生成文件 如果文件没有创建

def d1= new File('Directory1')
d1.mkdir()  新建一个文件夹 如果没有创建

new File('D:/Groovy/Scripts').list().toList() 返回该目录下所有文件的列表 List

f2.renameTo( new File('RenamedFile2.txt') ) 重命名

new File('File1.txt').deleteOnExit() 建立临时文件

list= f1.readLines() 读取文件的一行

中文的读取
f2.write('一二三四五', 'unicode') //overwrites existing contents
assert f2.getText('unicode') == '一二三四五'

Streams 流的操作

def fos= new FileOutputStream('TestFile.txt') 打开一个文件输出流

[ 21, 34, 43, 79 ].each{ fos.write(it) } 输出内容
fos.flush() 同样可以调用清空缓存的方法

读取文件中的字节流
new File('TestFile.txt').readBytes().toList() ==
    [ 21, 34, 43, 79, 69, 32, 22, 13, 88 ]

stream记得手动close

new File('TestFile.txt').delete() 删除文件

包装后的文件流处理器
def fw= new FileWriter('TestFile.txt')
new File('TestFile.txt').readLines() == [ 'abcdefghijklmnopqrstuvwxyz' ]  注意s 是读取多行

def fr= new FileReader('TestFile.txt')

文件的简单操作

打开并写入指定的内容,并且会自动关闭
new File('TestFile1.txt').withWriter{ w->
  w<< 'abc' << 'def' //operator syntax
  w.leftShift('ghi').leftShift('jkl') //equivalent method name
}

添加到文件上
new File('TestFile1.txt').withWriterAppend('unicode'){ w->
  w<< 'klmnop' //although appending, unicode marker 0xFEFF also added
}

def fw= new FileWriter('TestFile1.txt')
fw.withWriter{ w->
  ['ab,cd\n' + 'efg\n' + 'hi,jk\n' + 'l', 'mn,op'].each{
    w<< it
  }
} 也可以同样的效果

方便的读取
def list= []
new File('TestFile1.txt').eachLine{
  list<< it
}

new File('TestFile2.txt').text 也可以简单的读取文件中所有的内容,包括了换行 window下为\r\n

new File('TestFile1.txt').readBytes().toList() 字节的方式开始读取

new FileInputStream('TestFile2.txt').getText('unicode') 用于使用UTF编码读取中文

new FileOutputStream('TestFile2.txt').withWriter('unicode'){ w->
  w<< '我是法国人'
}               UTF的方式写入中文

def fos= new FileOutputStream(new File('TestFile.txt'), true) 
用于打开一个文件, 第二个参数默认为true,表示覆盖原文件,false表示使用append的方法

FileWriter的参数相同  其中new File('TestFile.txt') 都可以用直接的字符串代替

bwtr= new File('TheOutput.txt').newWriter('unicode') 给文件增加一个写入器

专门处理行数据的阅读器
def lnr= new LineNumberReader(new FileReader('TheOutput.txt'))

Closures 闭包的使用

def可以同时定义多个变量 使用,号分隔

def c = {...} 为Closure的典型应用 调用的时候使用c()  最后一行为返回的结果 ,有可能返回的是null

def f = { list, value -> list << value } 用于闭包的参数传递  默认为it
f(a,b)

复杂的闭包使用
def runTwice = { a, c -> c(c(a)) }

可以在调用的时候进行命名 然后在闭包中进行引用 只用map方式的参数传递 key:value
def f= {m, i, j-> i + j + m.x + m.y }
assert f(6, x:4, y:3, 7) == 20

定义一个函数
def f(){} 最后一行的为返回值  不需要用return

使用this.&函数名,进行函数的引用
def f(){ 77 }
def g = this.&f
assert g() == 77
也可以不使用特别字符 直接使用
def h = g   也可以

function 函数中也可以传递参数,也支持不同参数的重载
也可以直接使用return返回值,默认是返回最后一行的值

也可以设置返回值类型,不使用def声明函数
void f3(){ 10 }
assert f3() == null //null always returned
返回指定的类型,例子中有void决定

当方法和closure同名的时候,方法会被优先调用

closure可以当做参数被传递

可以给函数的参数定义一个默认值
def dd( a, b=2 ){ "$a, $b" }
当b参数为空的时候,默认就会为2

特别的例子
其中会将X:4 类型的参数自动放置到第一位,并且合并到一起,其他的按照顺序排序,复制给方法里面的参数引用
def f(m, i, j){ i + j + m.x + m.y }
assert f(6, x:4, y:3, 7) == 20

用数组Array接受多个参数
def c( arg, Object[] extras ){
  def list= []
  list<< arg
  extras.each{ list<< it }
  list
}
assert c( 1 )          == [ 1 ]
assert c( 1, 2, 3, 4 ) == [ 1, 2, 3, 4 ]


Classes概念

可以使用闭包访问私有的属性
就是使用try 块定义的局部变量

static private a= 11 定义个类内部的静态私有变量,不能直接访问,不过却可以在同个类的内部使用

Closure c= {it * 3}  可以显式的声明一个闭包对象

oa.class in Object[] 判断一个对象的类型是否为指定类型  关键字 in
分享到:
评论

相关推荐

    HelloGroovy

    《深入浅出Groovy编程语言:HelloGroovy的探索之旅》 Groovy,作为一种动态、灵活的编程语言,是Java平台上的一个强大工具。它在Java虚拟机(JVM)上运行,与Java代码无缝集成,同时提供了简洁的语法和强大的功能。...

    jmeter 实现oauth1.0授权认证

    在HTTP请求配置中,填入相应的URL、方法(GET、POST等)以及任何必要的参数。 2. **使用BeanShell预处理器**: 在HTTP请求取样器下,添加一个BeanShell预处理器。BeanShell是JMeter内置的Java脚本引擎,允许我们在...

    信捷PLC应用实例解析:随机密码、动态验证码与分期付款锁机系统的实现

    内容概要:本文详细介绍了信捷PLC在多个应用场景中的具体实现,包括随机密码生成、动态验证码、动态分期付款功能及锁机例程。首先探讨了随机密码生成,通过PLC的随机数生成功能并结合数学运算,实现了4位随机密码。其次,讲解了动态验证码的实现,利用PLC的实时时钟和通信功能,使验证码随时间动态变化。再次,介绍了动态分期付款功能,通过监测支付信号和比较已支付金额与总金额,实现分期付款的控制。最后,讨论了锁机例程,通过状态继电器和时间窗控制,确保设备在特定条件下不被随意使用。每个部分都提供了详细的梯形图代码和注释,帮助读者理解和实现。 适合人群:对PLC编程有一定基础的技术人员,尤其是从事工业自动化领域的工程师。 使用场景及目标:适用于需要增强设备安全性、提高验证机制可靠性的工业控制系统。通过学习这些例程,工程师可以在实际项目中灵活运用PLC实现复杂的功能,如设备访问控制、支付管理等。 其他说明:文中不仅提供了具体的代码实现,还分享了一些实用技巧和注意事项,如密码比对策略、时间同步校验、多品牌PLC移植建议等。此外,还提到了一些防破解措施,增强了系统的安全性。

    213000-fbo-ggs-Linux-x64-Oracle-shiphome.zipogg21.3安装包,适用于经典架构

    213000-fbo-ggs-Linux-x64-Oracle-shiphome.zip ogg21.3安装包,适用于经典架构

    基于Stanley算法与预瞄距离自适应的CarSim与Simulink联合仿真模型及其应用

    内容概要:本文介绍了基于Stanley算法和预瞄距离自适应机制的CarSim与Simulink联合仿真模型。Stanley算法用于路径跟踪,通过计算横向和航向偏差调整车辆转向角;预瞄距离自适应机制根据车辆速度动态调整预瞄距离,确保在不同速度和路况下都能灵活应对。CarSim提供高精度车辆动力学模型,Simulink则负责算法实现和系统集成。文中还分享了多个实用技巧,如速度单位转换、PID控制器参数调整、数据同步问题解决等,并提供了完整的模型文件供下载。 适合人群:从事自动驾驶研究的技术人员、高校师生及相关领域的研究人员。 使用场景及目标:适用于自动驾驶路径跟踪的研究与开发,旨在提高车辆在不同速度和路况下的路径跟踪性能,减少横向误差,增强行驶稳定性。 其他说明:文中提到的模型文件包括Carsim参数配置文件cpar、Simulink模型文件及详细参考资料,有助于快速搭建并调试联合仿真环境。

    西门子S7-1200 PLC在污水处理项目中的Modbus通讯与PID控制应用详解

    内容概要:本文详细介绍了西门子S7-1200 PLC在污水处理项目中的应用,涵盖多个关键技术模块。首先讨论了模拟量转换,通过具体的代码示例展示了如何将模拟量信号转换为可用于控制的数值。接下来探讨了电动阀控制,解释了如何利用逻辑指令实现电动阀的开关控制。液位控制部分则通过比较指令实现了液位的精准调控。Modbus通讯部分讲解了如何通过Modbus协议控制变频器,包括通讯参数的配置和数据传输的具体实现。PID控制部分详细解析了PID控制器的参数设置及其在污水处理中的应用。最后,PUT与 GET指令的应用确保了主站与从站之间的数据同步。此外,文中还分享了一些实战经验和调试技巧,如模拟量处理的基本方法、Modbus通讯的注意事项以及PID控制的实际应用。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和污水处理控制系统感兴趣的读者。 使用场景及目标:①帮助工程师理解和掌握西门子S7-1200 PLC在污水处理项目中的具体应用;②提供详细的代码示例和实战经验,便于读者快速上手并应用于实际项目;③解决常见问题,提高系统的稳定性和可靠性。 其他说明:文中不仅涵盖了理论知识,还包括大量的实战经验和调试技巧,有助于读者更好地应对实际项目中的挑战。

    【A股温度计】www.agwdj.com 镜像版程序V1.0

    【A股温度计】www.agwdj.com 镜像版程序V1.0说明 •通过数据可视化技术,将复杂的A股市场数据转化为直观的图形界面,帮助投资者快速把握市场脉搏。 【核心功能】 •全景视角:突破信息碎片化局限,快速定位涨跌分布,一眼锁定今日热点板块 •板块排序:基于申万行业分类标准,对31个一级行业和131个二级行业实时动态排序 •硬件适配:智能适配不同分辨率屏幕,4K以上屏幕显示信息更多(视觉更佳) •智能缩放:A股全图让大A市场5000+个股同屏显示(支持鼠标滚轮及触摸设备5级缩放) 【三秒原则】 •三秒看懂:通过精心设计的视觉图形,让用户在三秒内看清市场整体状况 •三秒定位:智能算法让大成交额个股和热点板块自动靠前,快速定位机会 •三秒操作:极简的界面,让用户减少操作 【使用场景】 •盘前准备:快速了解隔夜市场变化,制定当日策略 •盘中监控:实时跟踪市场动向,及时把握当日机会 •盘后复盘:全面分析当日市场表现,总结经验教训 【适合人群】 •个人用户:快速了解市场整体趋势变化,辅助决策 •专业人员:获取每天市场的数据云图支持研究工作 •金融机构:作为投研系统的可视化补充组件 •财经媒体:制作专业市场分析图表和报道 【市场切换】 •默认加载"A股全图",可切换单独显示的类型如下: •上证A股/深证A股/北证A股/创业板/科创板/ST板块/可转债/ETF 【程序优势】 •运行环境:纯PHP运行(无需安装任何数据库) •数据更新:实时同步→A股温度计→www.agwdj.com •显示优化:自动适配8K/4K/2K/1080P等不同分辨率的屏幕 •设备兼容:对市面上主流的设备及浏览器做了适配(检测到手机/平板/电视等默认Chrome/Firefox/Edge内核过低的情况会自动提示) 【其他说明】 •A股温度计程序演示网址:https://www.agwdj.com

    汽车车载网络系统检修.ppt

    汽车车载网络系统检修.ppt

    【KUKA 机器人资料】:KUKA 机器人初级培训教材.pdf

    KUKA机器人相关文档

    基于Matlab的模拟退火算法在旅行商问题(TSP)优化中的应用及其实现

    内容概要:本文详细介绍了利用Matlab实现模拟退火算法来优化旅行商问题(TSP)。首先阐述了TSP的基本概念及其在路径规划、物流配送等领域的重要性和挑战。接着深入讲解了模拟退火算法的工作原理,包括高温状态下随机探索、逐步降温过程中选择较优解或以一定概率接受较差解的过程。随后展示了具体的Matlab代码实现步骤,涵盖城市坐标的定义、路径长度的计算方法、模拟退火主循环的设计等方面。并通过多个实例演示了不同参数配置下的优化效果,强调了参数调优的重要性。最后讨论了该算法的实际应用场景,如物流配送路线优化,并提供了实用技巧和注意事项。 适合人群:对路径规划、物流配送优化感兴趣的科研人员、工程师及高校学生。 使用场景及目标:适用于需要解决复杂路径规划问题的场合,特别是涉及多个节点间最优路径选择的情况。通过本算法可以有效地减少路径长度,提高配送效率,降低成本。 其他说明:文中不仅给出了完整的Matlab代码,还包括了一些优化建议和技术细节,帮助读者更好地理解和应用这一算法。此外,还提到了一些常见的陷阱和解决方案,有助于初学者避开常见错误。

    BYVIN电动四轮车控制器代码详解:STM32F4硬件与软件设计

    内容概要:本文详细介绍了BYVIN(比德文)电动四轮车控制器的技术细节,涵盖了硬件设计和软件实现两大部分。硬件方面,提供了PCB文件和PDF原理图,展示了电路板布局、元件位置及电路连接关系。软件方面,代码结构清晰,模块化设计良好,包括初始化、速度数据处理、PWM配置、故障保护机制等功能模块。文中还提到了一些独特的设计细节,如PWM死区补偿、故障分级处理、卡尔曼滤波估算电池电量等。此外,代码仓库中还包括了详细的注释和调试技巧,如CAN总线实时数据传输、硬件级关断+软件状态机联动等。 适合人群:具备一定嵌入式开发基础的研发人员,尤其是对STM32F4系列单片机和电动车辆控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解电动四轮车控制器设计原理和技术实现的研究人员和开发者。目标是掌握电动四轮车控制器的硬件设计方法和软件编程技巧,提升实际项目开发能力。 其他说明:本文不仅提供了代码和技术细节,还分享了许多实战经验和设计思路,有助于读者更好地理解和应用这些技术。

    【剧本杀AI提示词指令】基于AI的剧本杀定制化创作系统(deepseek,豆包,kimi,chatGPT,扣子空间,manus,AI训练师)

    内容概要:本文介绍了一个专业的剧本杀创作作家AI。它能根据客户需求创作各种风格和难度的剧本杀剧本,并提供创作建议和修改意见。其目标是创造引人入胜、逻辑严密的剧本体验。它的工作流程包括接收理解剧本要求、创作剧本框架情节、设计角色背景线索任务剧情走向、提供修改完善建议、确保剧本可玩性和故事连贯性。它需保证剧本原创、符合道德法律标准并在规定时间内完成创作。它具备剧本创作技巧、角色构建理解、线索悬念编织、文学知识和创意思维、不同文化背景下剧本风格掌握以及剧本杀游戏机制和玩家心理熟悉等技能。; 适合人群:有剧本杀创作需求的人群,如剧本杀爱好者、创作者等。; 使用场景及目标:①为用户提供符合要求的剧本杀剧本创作服务;②帮助用户完善剧本杀剧本,提高剧本质量。; 阅读建议:此资源详细介绍了剧本杀创作作家AI的功能和服务流程,用户可以依据自身需求与该AI合作,明确表达自己的创作需求并配合其工作流程。

    空气耦合超声仿真的COMSOL模型解析与应用实例

    内容概要:本文详细介绍了五个用于空气耦合超声仿真的COMSOL模型,涵盖二维和三维场景,适用于铝板和钢板的多种缺陷检测。每个模型都包含了具体的参数设置、边界条件选择以及优化技巧。例如,Lamb波检测模型展示了如何利用A0模态检测铝板内的气泡,而三维模型则强调了内存管理和入射角参数化扫描的重要性。表面波检测模型提供了裂纹识别的相关性分析方法,变厚度模型则展示了如何通过几何参数化来模拟复杂的工件形态。文中还分享了许多实用的操作技巧,如内存优化、信号处理和自动化检测逻辑。 适用人群:从事无损检测研究的技术人员、COMSOL软件使用者、超声检测领域的研究人员。 使用场景及目标:①帮助用户理解和掌握空气耦合超声仿真的具体实现方法;②提供实际工程应用中的缺陷检测解决方案;③指导用户进行高效的仿真建模和结果分析。 其他说明:文中提供的模型不仅涵盖了常见的缺陷检测场景,还包括了一些高级技巧,如参数化扫描、自动化检测逻辑等,能够显著提高工作效率。同时,文中还给出了硬件配置建议和一些常见的注意事项,确保用户可以顺利运行这些模型。

    【精通各种销售文案的专家】AI提示词销售文案自动生成系统:文案创作与优化全流程解析

    内容概要:本文档介绍了名为“精通各种销售文案的专家”的虚拟角色,该角色由深度学习和自然语言处理技术构建,旨在为各行业提供专业的销售文案服务。文档详细列出了角色的背景、偏好、目标、限制条件以及技能。它强调了角色在文案创意撰写、精准市场定位、效果优化和培训指导方面的能力,并且提到它能够根据不同的产品特性创作多元化的文案风格,同时确保文案符合法律规范、品牌形象一致性和时效性。此外,还展示了具体的文案示例,如智能手表和空气净化器的广告语,最后概述了与用户合作的标准流程,包括初步沟通、文案构思、初稿撰写及反馈修订等步骤。; 适合人群:需要撰写或优化销售文案的企业营销人员、广告策划师以及想要提高文案写作水平的内容创作者。; 使用场景及目标:①为企业或个人提供定制化销售文案服务,以提升品牌影响力和销售业绩;②帮助文案撰写者掌握文案策划技巧,提高文案质量;③确保文案符合法律法规和品牌要求,维护品牌形象。; 阅读建议:阅读时应重点关注角色的核心能力和所提供的具体服务,同时注意文档中提及的文案创作原则和流程,以便更好地理解如何利用该角色来满足自身的文案需求。

    【KUKA 机器人资料】:kuka Robot 初级培训.pdf

    KUKA机器人相关文档

    多智能体系统中神经网络与自适应动态滑模控制的Simulink复现及优化

    内容概要:本文详细探讨了多智能体系统中神经网络与自适应动态滑模控制的应用及其在Simulink中的复现。首先介绍了多智能体系统的概念及其通信方式,然后讨论了神经网络在多智能体决策中的应用,展示了如何使用Keras构建前馈神经网络。接着阐述了自适应动态滑模控制的基本原理,包括滑模面设计和自适应控制参数调整。最后,重点讲解了如何在Simulink中集成这些技术,提供了具体的实现步骤和优化建议,如使用Matlab Function模块嵌入神经网络和自适应滑模控制算法,以及解决抖振问题的方法。 适合人群:从事智能控制系统研究和开发的技术人员,尤其是对多智能体系统、神经网络和自适应动态滑模控制感兴趣的科研人员和工程师。 使用场景及目标:适用于需要提高多智能体系统在复杂环境下稳定性和效率的研究项目。具体目标包括减少控制系统的抖振现象,提升响应速度和精度,降低计算资源消耗。 其他说明:文中提供的代码片段和实现细节有助于读者快速理解和应用这些先进技术。同时,强调了在实际工程中需要注意的问题,如采样时间和代数环检测等。

    永磁同步电机无传感器控制:基于改进卡尔曼滤波速度观测器的Simulink建模与应用

    内容概要:本文详细探讨了永磁同步电机(PMSM)无传感器控制领域的改进卡尔曼滤波速度观测器的应用。首先介绍了卡尔曼滤波的基本原理及其在PMSM速度观测中的应用,指出了传统卡尔曼滤波在复杂非线性系统中的局限性。接着阐述了改进卡尔曼滤波的具体方法,包括自适应调整过程噪声协方差矩阵Q和观测噪声协方差矩阵R,以应对PMSM运行时参数变化的情况。文中还展示了如何在Simulink中构建PMSM的数学模型并实现普通和改进卡尔曼滤波的子模块,通过仿真对比验证了改进算法的有效性和优越性。此外,讨论了改进版在不同工况下的表现,尤其是在高速区和负载突变情况下的精度提升。 适合人群:从事电机控制系统研究与开发的技术人员,尤其是对卡尔曼滤波有一定了解并希望深入了解其在PMSM无传感器控制中应用的人群。 使用场景及目标:适用于需要提高PMSM无传感器控制精度的研发项目,目标是通过改进卡尔曼滤波算法,实现更精准的速度和位置估计,降低系统成本并提高可靠性。 其他说明:文章强调了改进卡尔曼滤波在实际应用中的细节处理,如自适应调整噪声协方差矩阵、优化矩阵运算等,为后续研究提供了宝贵的实践经验和技术指导。

    游戏型多媒体教育软件.ppt

    游戏型多媒体教育软件.ppt

    【KUKA 机器人资料】:KUKA Unternehmenspr_sentation.pdf

    KUKA机器人相关文档

    电力电子领域三相MMC整流器的控制策略与MATLAB实现详解

    内容概要:本文深入探讨了三相模块化多电平变换器(MMC)整流器的控制策略及其MATLAB实现。首先介绍了双闭环控制机制,包括电流外环和电压内环的作用及其Python代码示例。接着详细讲解了桥臂电压均衡控制、模块电压均衡控制以及环流抑制控制的具体方法和技术细节。此外,还讨论了载波移相调制的应用,展示了如何通过MATLAB生成移相载波信号。文中提供了大量MATLAB代码片段,帮助读者更好地理解和实现这些控制策略。 适合人群:从事电力电子领域的研究人员、工程师以及相关专业的学生。 使用场景及目标:适用于需要深入了解MMC整流器控制策略的研究和开发项目。目标是掌握MMC整流器的工作原理、控制方法及其具体实现,从而应用于实际工程项目中。 其他说明:文章强调了实际工程应用中的注意事项,如调参技巧、波形质量优化等,并提醒读者仿真结果与实际情况可能存在差异,需预留一定的调节空间。

Global site tag (gtag.js) - Google Analytics