首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

Linux基础之文本处理工具grep及正则表达式(附带egrep与grep的不同)

文本处理工具grep,正则表达式在Linux学习过程中很容易出现困惑与障碍的地方,这里分享下学习这方面内容的一些感受。 grep Global search REgular expression and Print out the line 作用:文本搜索工具,根据用户指定的‘模式(过滤条件)’对目标文本逐行进行匹配检查;打印匹配到的行; ‘模式’:由正则表达式的元字符及文本字符所编写出的过滤条件。 grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] 常用选项: -i:忽略字符大小写 -o:仅显示匹配到的字符串本身 -v:显示不能被模式匹配到的行 -E:支持扩展正则表达式元字符 -q:静默模式,匹配不显示 -A#:after,显示匹配条件所在行的后#行 -B#:before,显示匹配条件所在行的前#行 -C#:context,显示匹配条件所在行的前后#行 -n:显示匹配的行号(用的较少) -c: 统计匹配的行数(用的较少) 下面以几个小实验对grep的用法及选项做下具体的演示 实验目录/test 文本/test/head [root@localhosttest]#cathead 12345Sdabcsaber Berarbserac 12cds 67890 12 345 123 6 正则表达式:Regual Expression,REGEXP 它由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。 它分两类:基本正则表达式BRE、扩展正则表达式ERE 基本正则表达式元字符: 包括:字符匹配、匹配次数、位置锚定、分组 字符匹配: . :匹配任意单个字符; [] :匹配指定范围内的任意单个字符 [^] :匹配指定范围外的任意单个字符 常用集合:[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:] 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数 *:匹配前面的字符任意次,包括0次;贪婪模式:尽可能长的匹配 .*:任意长度的任意字符 \?:匹配其前面的字符0或1次 \+:匹配其前面的字符至少1次 \{m\}:匹配前面的字符m次 \{m,n\}:匹配前面的字符至少m次,至多n次 \{,n\}:匹配前面的字符至多n次 \{m,\}:匹配前面的字符至少m次 位置锚定:定位出现的位置 ^:行首锚定,用于模式的最左侧 $:行尾锚定,用于模式的最右侧 ^PATTERN$: 用于模式匹配整行 ^$: 空行 ^[[:space:]]*$ :空白行 单词:非特殊字符组成的连续字符在Linux看来都称单词 \< 或\b:词首锚定,用于单词模式的左侧 \> 或\b:词尾锚定;用于单词模式的右侧 \<PATTERN\>:匹配完整的单词 1、查找以for开头的行 2、检索只含有for的字符串;检索含有for的内容 3、检索以for结尾的行;检索以for结尾的字符串 分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+ 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ... \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符; 实例:\(string1\+\(string2\)*\) \1: string1\+\(string2\)* \2: string2 后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身) 上述命令意思是检索包含有for字符串后跟任意字符且出现一次,连续出现上述情况两次截取结果。后面的\1是重复第一个括号内的检索对象。 egrep= grep -E egrep[OPTIONS] PATTERN [FILE...] 扩展正则表达式的元字符: 字符匹配:同基本正则表达式 次数匹配: *:匹配前面字符任意次 ?: 0或1次 +:1次或多次 {m}:匹配m次 {m,n}:至少m,至多n次 位置锚定:同基本正则表达式 分组: () 后向引用:\1, \2, ... 或者: a|b C|cat: C或cat (C|c)at:Cat或cat 最后我们通过9个例子来感受grep与正则表达式结合所能实现的功能 1、显示/proc/meminfo文件中以大小s开头的行 这个只需要知道grep的选项i就能轻松解决。 2、显示/etc/passwd文件中不以/bin/bash结尾的行 先使用grep检索出包含有以“/bin/bash”结尾的行,再使用grep的-v取不以上面结果的行。类似数学中的补集效果。 3、找出ifconfig命令结果中本机的所有IPv4地址 这个分为三步: 1)通过grep锁定包含有IPV4的行,这个通过分析ifconfig列出的信息可以看出规律,只要包含有IPv4的开头都有inet这个字母,所以我们只需要检索它就行了 2)接下来使用tr将所有空替换为“:”并压缩 3)使用cut实现结果。 4、查出分区空间使用率的最大百分比值 这个大致分6步: 1)过滤汉字 2)使用tr替换所有空为":"并压缩 3)使用cut剪切出含有使用率百分比的数值 4)再次使用tr剔除% 5)使用sort按数值大小写排序 6)使用tail取出最大值 5、显示用户rpc默认的shell程序 上面的检索条件是以rpc为行首且以它为字符结尾的行 6、找出/etc/passwd中的两位或三位数 这里使用的是扩展正则表达式因为可以是表达式更简洁 这里需要注意的是要以两位或三位数为字符串,这需要对其进行开头与结尾的字符锚定 7、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行 当我们想好要过滤的条件后,要对其进行行首及字符的锚定,否则会导致条件范围不严谨 这里要注意的是.*\>\(\),如果这里改写为.*\(\)\>则会失败,具体可以自己想想。其实.*已经包括了"()",所以后面的是重复的,这样就容易出错。 8、使用egrep取出/etc/rc.d/init.d/functions中其基名 上面是两种方法,一种利用grep直接检索出来,另一种的思想是分割。各有特点 9、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255 \<[0-9]\>:0-9 \<[1-9][0-9]|>:10-99 \<1[0-9][0-9]\> | \<1[0-9]{2}\>:100-199 \<2[0-4][0-9]\> :200-249 \<25[0-5]\>:250-255 上面只是对grep及正则表达式的简要总结,不过只要掌握好这基本的内容自己也就可以进行更深入的学习了。

优秀的个人博客,低调大师

ETH geth私链搭建linux安装(以太坊是一个用于分散式应用程序的全球性开源平台)

一.下载对应系统的geth包 https://ethereum.github.io/go-ethereum/downloads/ 二.下载安装包 https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.18-f5382591.tar.gz 三.解压安装包 tar -zxvf geth-linux-amd64-1.9.18-f5382591.tar.gz 四.进入文件夹 cd geth-linux-amd64-1.9.18-f5382591 五.启动参数详细介绍 以太坊客户端Geth命令用法-参数详解 命令用法 geth [选项] 命令 [命令选项] [参数…] 命令: account 管理账户 attach 启动交互式JavaScript环境(连接到节点) bug 上报bug Issues console 启动交互式JavaScript环境 copydb 从文件夹创建本地链 dump Dump(分析)一个特定的块存储 dumpconfig 显示配置值 export 导出区块链到文件 import 导入一个区块链文件 init 启动并初始化一个新的创世纪块 js 执行指定的JavaScript文件(多个) license 显示许可信息 makecache 生成ethash验证缓存(用于测试) makedag 生成ethash 挖矿DAG(用于测试) monitor 监控和可视化节点指标 removedb 删除区块链和状态数据库 version 打印版本号 wallet 管理Ethereum预售钱包 help,h 显示一个命令或帮助一个命令列表 ETHEREUM 配置选项: --config value TOML 配置文件 --datadir “xxx” 数据库和keystore密钥的数据目录 --keystore keystore存放目录(默认在datadir内) --nousb 禁用监控和管理USB硬件钱包 --networkid value 网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1) --testnet Ropsten网络:预先配置的POW(proof-of-work)测试网络 --rinkeby Rinkeby网络: 预先配置的POA(proof-of-authority)测试网络 --syncmode "fast" 同步模式 ("fast", "full", or "light") --ethstats value 上报ethstats service URL (nodename:secret@host:port) --identity value 自定义节点名 --lightserv value 允许LES请求时间最大百分比(0 – 90)(默认值:0) --lightpeers value 最大LES client peers数量(默认值:20) --lightkdf 在KDF强度消费时降低key-derivation RAM&CPU使用 开发者(模式)选项: --dev 使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。 --dev.period value 开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0) 交易池选项: --txpool.nolocals 为本地提交交易禁用价格豁免 --txpool.journal value 本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp") --txpool.rejournal value 重新生成本地交易日志的时间间隔 (默认: 1小时) --txpool.pricelimit value 加入交易池的最小的[gas](https://learnblockchain.cn/2019/06/11/gas-mean/)价格限制(默认: 1) --txpool.pricebump value 价格波动百分比(相对之前已有交易) (默认: 10) --txpool.accountslots value 每个帐户保证可执行的最少交易槽数量 (默认: 16) --txpool.globalslots value 所有帐户可执行的最大交易槽数量 (默认: 4096) --txpool.accountqueue value 每个帐户允许的最多非可执行交易槽数量 (默认: 64) --txpool.globalqueue value 所有帐户非可执行交易最大槽数量 (默认: 1024) --txpool.lifetime value 非可执行交易最大入队时间(默认: 3小时) 性能调优的选项: --cache value 分配给内部缓存的内存MB数量,缓存值(最低16 mb /数据库强制要求)(默认:128) --trie-cache-gens value 保持在内存中产生的trie node数量(默认:120) 帐户选项: --unlock value 需解锁账户用逗号分隔 --password value 用于非交互式密码输入的密码文件 API 和控制台选项: --rpc 启用HTTP-RPC服务器 --rpcaddr value HTTP-RPC服务器接口地址(默认值:“localhost”) --rpcport value HTTP-RPC服务器监听端口(默认值:8545) --rpcapi value 基于HTTP-RPC接口提供的API --ws 启用WS-RPC服务器 --wsaddr value WS-RPC服务器监听接口地址(默认值:“localhost”) --wsport value WS-RPC服务器监听端口(默认值:8546) --wsapi value 基于WS-RPC的接口提供的API --wsorigins value websockets请求允许的源 --ipcdisable 禁用IPC-RPC服务器 --ipcpath 包含在datadir里的IPC socket/pipe文件名(转义过的显式路径) --rpccorsdomain value 允许跨域请求的域名列表(逗号分隔)(浏览器强制) --jspath loadScript JavaScript加载脚本的根路径(默认值:“.”) --exec value 执行JavaScript语句(只能结合console/attach使用) --preload value 预加载到控制台的JavaScript文件列表(逗号分隔) 网络选项: --bootnodes value 用于P2P发现引导的enode urls(逗号分隔)(对于light servers用v4+v5代替) --bootnodesv4 value 用于P2P v4发现引导的enode urls(逗号分隔) (light server, 全节点) --bootnodesv5 value 用于P2P v5发现引导的enode urls(逗号分隔) (light server, 轻节点) --port value 网卡监听端口(默认值:30303) --maxpeers value 最大的网络节点数量(如果设置为0,网络将被禁用)(默认值:25) --maxpendpeers value 最大尝试连接的数量(如果设置为0,则将使用默认值)(默认值:0) --nat value NAT端口映射机制 (any|none|upnp|pmp|extip:<IP>) (默认: “any”) --nodiscover 禁用节点发现机制(手动添加节点) --v5disc 启用实验性的RLPx V5(Topic发现)机制 --nodekey value P2P节点密钥文件 --nodekeyhex value 十六进制的P2P节点密钥(用于测试) 矿工选项: --mine 打开挖矿 --minerthreads value 挖矿使用的CPU线程数量(默认值:8) --etherbase value 挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”) --targetgaslimit value 目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”) --gasprice value 挖矿接受交易的最低gas价格 --extradata value 矿工设置的额外块数据(默认=client version) GAS 价格选项: --gpoblocks value 用于检查gas价格的最近块的个数 (默认: 10) --gpopercentile value 建议gas价参考最近交易的gas价的百分位数,(默认: 50) 虚拟机的选项: --vmdebug 记录VM及合约调试信息 日志和调试选项: --metrics 启用metrics收集和报告 --fakepow 禁用proof-of-work验证 --verbosity value 日志详细度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3) --vmodule value 每个模块详细度:以 <pattern>=<level>的逗号分隔列表 (比如 eth/*=6,p2p=5) --backtrace value 请求特定日志记录堆栈跟踪 (比如 “block.go:271”) --debug 突出显示调用位置日志(文件名及行号) --pprof 启用pprof HTTP服务器 --pprofaddr value pprof HTTP服务器监听接口(默认值:127.0.0.1) --pprofport value pprof HTTP服务器监听端口(默认值:6060) --memprofilerate value 按指定频率打开memory profiling (默认:524288) --blockprofilerate value 按指定频率打开block profiling (默认值:0) --cpuprofile value 将CPU profile写入指定文件 --trace value 将execution trace写入指定文件 WHISPER 实验选项: --shh 启用Whisper --shh.maxmessagesize value 可接受的最大的消息大小 (默认值: 1048576) --shh.pow value 可接受的最小的POW (默认值: 0.2) 弃用选项: --fast 开启快速同步 --light 启用轻客户端模式 其他选项: –help, -h 显示帮助 六.下载火星节点配置文件由于国内以太坊节点非常稀少,并且国内外网络不通畅等原因导致国内服务器同步区块数据非常缓慢还容易丢包,由EthFans发起的星火节点计划可以帮助我们加快同步速度。 下载节点列表:https://upyun-assets.ethfans.org/uploads/doc/file/b0c5266be42f43f1baf7207c432bede6.json?_upd=static-nodes.json 下载后将static-nodes.json文件放在区块存储目录下即可。 7.创建初始账户 geth --datadir /ethereum account new 8.创建创世文件 { "config": { "chainId": 100, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x1388", "difficulty": "0x1", "alloc": { "0xDFeDb94Ab496d6b68795dB890AcbbBdc2557860A": { "balance": "100000000000000000000000000000000" } } } 其中的 alloc 属性是给账户分配余额 。切记,余额是以wei为单位的,就是balance值要除以10的18次方才等于eth的数量。9.初始化创世区块 geth --datadir /ethereum init /ethereum/genesis.json 10.生成配置文件夹 geth --datadir '/ethereum' --networkid 100 --cache 512 --rpc --rpcaddr '0.0.0.0' --rpcport 8545 --rpcapi 'db,eth,net,web3,personal' --rpccorsdomain '*' --allow-insecure-unlock dumpconfig > /ethereum/geth_config --networkid指定网络ID 1代表主网络 2代表测试网络 没有提供则默认测试网络,乱写代表创建私有链11.后台运行 nohup geth --config /ethereum/geth_config >> /var/log/geth.log 2>&1 & 12.监控区块同步日志 tail -f /var/log/geth.log 13.进入控制台 geth attach /ethereum/geth.ipc 14.使用命令查看当前同步情况 eth.syncing 如果返回的是false,证明同步完成了,可以使用当前节点。 否则会返回同步状态 currentBlock为当前下载到的区块高度,请注意,下载块不等于同步数据了,下载块是一个简单快速的过程,只验证相关的工作量证明,在下载块的同时geth也在一直下载所有的区块数据,当数据下载完成后届时才会处理曾经发生过的所有交易,重新组装整个链。 15.api调用推荐地址 各编程语言现成类库 Java:https://github.com/web3j/web3j Python:https://github.com/ethereum/web3.py PHP:https://github.com/sc0Vu/web3.php NodeJs:https://github.com/ethereum/web3.js 16.后期推出各大主流币交易所钱包处理代码

优秀的个人博客,低调大师

java基础学习_集合类03_用户登录注册案例(集合版)、Set集合、Collection集合总结_day17总结

==========================================================================================================================================================涉及到的知识点有: 1:用户登录注册案例(集合版)(理解) 2:Set集合(理解) (1)Set集合的特点 (2)HashSet集合(掌握) (3)TreeSet集合(理解) (4)案例3:Collection集合总结(掌握) 4:针对Collection集合我们到底使用谁呢?(掌握) 5:在集合中常见的数据结构(掌握)==========================================================================================================================================================1:用户登录注册案例(集合版)(理解)-----------------------------------------------------------------------------2:Set集合(理解) (1)Set集合的特点 无序:存和取的顺序不一致,无索引,不可以存储重复元素(唯一)--------------------------------------- (2)HashSet集合(掌握) A:底层的数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法:hashCode()和equals() 执行顺序: 首先比较哈希值是否相同 相同:继续执行equals()方法 返回true:元素重复了,不添加 返回false:直接把元素添加到集合 不相同:就直接把元素添加到集合 C:如何保证元素唯一性的呢? 由hashCode()和equals()保证的。 即:int hashCode() boolean equals(Object obj) D:开发的时候,代码非常的简单,自动生成即可。 E:案例 1.HashSet存储字符串并遍历(注意:字符串默认重写了hasCode()和equals()方法) 2.HashSet存储自定义对象并遍历(对象的成员变量值都相同即为同一个元素) F:LinkedHashSet:底层的数据结构由哈希表和链表组成。 哈希表保证元素的唯一性。 链表保证元素有序。(存储和取出顺序一致) 注意事项: 1.一般来说,不同的字符串的哈希值是不同的。 哈希值仅仅是逻辑值,可能一样。 地址值是实际的物理值,不一样。 2.HashSet:它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。 注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序, 而你的顺序恰好和它的存储顺序一致,这代表不了有序,你可以多存储一些数据,就能看到效果。 --------------------------------------- (3)TreeSet集合(理解) A:底层数据结构是红黑树(是一个自平衡的二叉树)(自平衡:说明其结构不会太深) B:保证元素的排序方式(具体那种方式取决于使用TreeSet的构造方法) a:自然排序(元素具备比较性) 让元素所属的类实现自然排序 Comparable接口。 示例代码如下: 1 package cn.itcast_06; 2 3 /* 4 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口,然后重写compareTo()方法 5 */ 6 public class Student implements Comparable<Student>{ 7 private String name; 8 private int age; 9 10 public Student() { 11 super(); 12 } 13 14 public Student(String name, int age) { 15 super(); 16 this.name = name; 17 this.age = age; 18 } 19 20 public String getName() { 21 return name; 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 28 public int getAge() { 29 return age; 30 } 31 32 public void setAge(int age) { 33 this.age = age; 34 } 35 36 @Override 37 public int compareTo(Student s) { 38 // 主要条件:姓名的长度 39 int num = this.name.length() - s.name.length(); 40 // 次要条件1:姓名的长度相同,不代表姓名的内容相同 41 int num2 = (num == 0 ? this.name.compareTo(s.name) : num); 42 // 次要条件2:姓名的长度和内容相同,不代表年龄也相同,所以还得继续比较年龄 43 int num3 = (num2 == 0 ? this.age - s.age : num2); 44 return num3; 45 } 46 47 } Student.java 1 package cn.itcast_06; 2 3 import java.util.TreeSet; 4 5 /* 6 * TreeSet存储自定义对象并保证排序和唯一 7 * 8 * 需求:请按照姓名的长度排序。 9 * 10 * TreeSet集合保证元素排序和唯一性的原理: 11 * 唯一性:是根据比较的返回是否是0来决定。 12 * 排序: 13 * A:自然排序(元素具备比较性) 14 * 让元素所属的类实现自然排序 Comparable接口。 15 * B:比较器排序(集合具备比较性) 16 * 让集合的构造方法接收一个比较器接口 Comparator的实现类对象,一般用匿名内部类实现。 17 */ 18 public class TreeSetDemo { 19 public static void main(String[] args) { 20 // 创建集合对象 21 // TreeSet的构造方法:public TreeSet() // 自然排序 22 TreeSet<Student> ts = new TreeSet<Student>(); 23 24 // 创建元素对象 25 Student s1 = new Student("linqingxia", 27); 26 Student s2 = new Student("zhangguorong", 29); 27 Student s3 = new Student("wanglihong", 23); 28 Student s4 = new Student("linqingxia", 27); 29 Student s5 = new Student("liushishi", 22); 30 Student s6 = new Student("wuqilong", 40); 31 Student s7 = new Student("fengqingy", 22); 32 Student s8 = new Student("linqingxia", 29); 33 34 // 添加元素到集合 35 ts.add(s1); 36 ts.add(s2); 37 ts.add(s3); 38 ts.add(s4); 39 ts.add(s5); 40 ts.add(s6); 41 ts.add(s7); 42 ts.add(s8); 43 44 // 遍历集合 45 for (Student s : ts) { 46 System.out.println(s.getName() + "---" + s.getAge()); 47 } 48 } 49 } TreeSetDemo.java b:比较器排序(集合具备比较性) 让集合的构造方法接收一个比较器接口 Comparator的实现类对象,一般用匿名内部类实现。 示例代码如下: (1)用自己新建的实现类实现 1 package cn.itcast_07; 2 3 /* 4 * 如果一个类的元素要想能够进行比较器排序。 5 */ 6 public class Student { 7 private String name; 8 private int age; 9 10 public Student() { 11 super(); 12 } 13 14 public Student(String name, int age) { 15 super(); 16 this.name = name; 17 this.age = age; 18 } 19 20 public String getName() { 21 return name; 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 28 public int getAge() { 29 return age; 30 } 31 32 public void setAge(int age) { 33 this.age = age; 34 } 35 36 } Student.java 1 package cn.itcast_07; 2 3 import java.util.Comparator; 4 5 public class MyComparator implements Comparator<Student> { 6 7 @Override 8 public int compare(Student s1, Student s2) { 9 // return 0; 10 11 // 需求:请按照姓名的长度排序 12 // int num = this.name.length() - s.name.length(); 13 // this --> s1 // s1不能直接访问name,因为s1是在MyComparator类中,而name是在Student类中,要想访问,需要通过getXxx()方法 14 // s --> s2 15 16 // 姓名长度 17 int num = s1.getName().length() - s2.getName().length(); 18 // 姓名内容 19 int num2 = (num == 0 ? s1.getName().compareTo(s2.getName()) : num); 20 // 年龄 21 int num3 = (num2 == 0 ? s1.getAge() - s2.getAge() : num2); 22 return num3; 23 } 24 25 } MyComparator.java 1 package cn.itcast_07; 2 3 import java.util.TreeSet; 4 5 /* 6 * 需求:请按照姓名的长度排序 7 * 8 * TreeSet集合保证元素排序和唯一性的原理: 9 * 唯一性:是根据比较的返回是否是0来决定。 10 * 排序: 11 * A:自然排序(元素具备比较性) 12 * 让元素所属的类实现自然排序 Comparable接口。 13 * B:比较器排序(集合具备比较性) 14 * 让集合的构造方法接收一个比较器接口 Comparator的实现类对象,一般用匿名内部类实现。 15 */ 16 public class TreeSetDemo { 17 public static void main(String[] args) { 18 // 创建集合对象 19 // TreeSet的构造方法:public TreeSet(Comparator<? super E> comparator) // 比较器排序,传递的数据类型是引用数据类型中的接口,说明传递的是实现类对象 20 TreeSet<Student> ts = new TreeSet<Student>(new MyComparator()); // 示例:自己写了个具体实现类MyMyComparator,并重写compare()方法 21 22 // 创建元素对象 23 Student s1 = new Student("linqingxia", 27); 24 Student s2 = new Student("zhangguorong", 29); 25 Student s3 = new Student("wanglihong", 23); 26 Student s4 = new Student("linqingxia", 27); 27 Student s5 = new Student("liushishi", 22); 28 Student s6 = new Student("wuqilong", 40); 29 Student s7 = new Student("fengqingy", 22); 30 Student s8 = new Student("linqingxia", 29); 31 32 // 添加元素到集合 33 ts.add(s1); 34 ts.add(s2); 35 ts.add(s3); 36 ts.add(s4); 37 ts.add(s5); 38 ts.add(s6); 39 ts.add(s7); 40 ts.add(s8); 41 42 // 遍历集合 43 for (Student s : ts) { 44 System.out.println(s.getName() + "---" + s.getAge()); 45 } 46 } 47 } TreeSetDemo.java (2)用用匿名内部类实现 1 package cn.itcast_07; 2 3 /* 4 * 如果一个类的元素要想能够进行比较器排序。 5 */ 6 public class Student { 7 private String name; 8 private int age; 9 10 public Student() { 11 super(); 12 } 13 14 public Student(String name, int age) { 15 super(); 16 this.name = name; 17 this.age = age; 18 } 19 20 public String getName() { 21 return name; 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 28 public int getAge() { 29 return age; 30 } 31 32 public void setAge(int age) { 33 this.age = age; 34 } 35 36 } Student.java 1 package cn.itcast_07; 2 3 import java.util.Comparator; 4 import java.util.TreeSet; 5 6 /* 7 * 需求:请按照姓名的长度排序 8 * 9 * TreeSet集合保证元素排序和唯一性的原理: 10 * 唯一性:是根据比较的返回是否是0来决定。 11 * 排序: 12 * A:自然排序(元素具备比较性) 13 * 让元素所属的类实现自然排序 Comparable接口。 14 * B:比较器排序(集合具备比较性) 15 * 让集合的构造方法接收一个比较器接口 Comparator的实现类对象,一般用匿名内部类实现。 16 */ 17 public class TreeSetDemo { 18 public static void main(String[] args) { 19 // 创建集合对象 20 // TreeSet的构造方法:public TreeSet() // 自然排序 21 // TreeSet<Student> ts = new TreeSet<Student>(); 22 23 // TreeSet的构造方法:public TreeSet(Comparator<? super E> comparator) // 比较器排序,传递的数据类型是引用数据类型中的接口,说明传递的是实现类对象 24 // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator()); // 示例:自己写了个具体实现类MyComparator,并重写compare()方法 25 26 // 如果一个方法的参数是接口,那么真正需要的是接口的实现类的对象,而且该方法只调用一次。 27 // 所以使用匿名内部类就可以实现这个东西,这样就不用自己去重新写一个具体的实现类了。其实这种方式是很常见的。 28 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { 29 @Override 30 public int compare(Student s1, Student s2) { 31 // 姓名长度 32 int num = s1.getName().length() - s2.getName().length(); 33 // 姓名内容 34 int num2 = (num == 0 ? s1.getName().compareTo(s2.getName()) : num); 35 // 年龄 36 int num3 = (num2 == 0 ? s1.getAge() - s2.getAge() : num2); 37 return num3; 38 } 39 }); 40 41 // 创建元素对象 42 Student s1 = new Student("linqingxia", 27); 43 Student s2 = new Student("zhangguorong", 29); 44 Student s3 = new Student("wanglihong", 23); 45 Student s4 = new Student("linqingxia", 27); 46 Student s5 = new Student("liushishi", 22); 47 Student s6 = new Student("wuqilong", 40); 48 Student s7 = new Student("fengqingy", 22); 49 Student s8 = new Student("linqingxia", 29); 50 51 // 添加元素到集合 52 ts.add(s1); 53 ts.add(s2); 54 ts.add(s3); 55 ts.add(s4); 56 ts.add(s5); 57 ts.add(s6); 58 ts.add(s7); 59 ts.add(s8); 60 61 // 遍历集合 62 for (Student s : ts) { 63 System.out.println(s.getName() + "---" + s.getAge()); 64 } 65 } 66 } TreeSetDemo.java C:把我们讲过的代码看一遍即可 (4)案例 A:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。 1.用集合HashSet实现 1 package cn.itcast_08; 2 3 import java.util.HashSet; 4 import java.util.Random; 5 6 /* 7 * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。 8 * 9 * 分析: 10 * A:创建随机数对象 11 * B:创建一个HashSet集合 12 * C:判断集合的长度是不是小于10,因为Integer包装类默认实现了Comparable接口,所以Integer类能自动判断是否有重复元素 13 * 是:就创建一个随机数添加 14 * 否:不搭理它 15 * D:遍历HashSet集合 16 */ 17 public class HashSetDemo { 18 public static void main(String[] args) { 19 // 创建随机数对象 20 Random r = new Random(); 21 22 // 创建一个HashSet集合 23 HashSet<Integer> hs = new HashSet<Integer>(); 24 25 // 判断集合的长度是不是小于10,因为Integer包装类默认实现了Comparable接口,所以Integer类能自动判断是否有重复元素 26 while (hs.size() < 10) { 27 int num = r.nextInt(20) + 1; 28 hs.add(num); 29 } 30 31 // 遍历HashSet集合 32 for (Integer i : hs) { 33 System.out.println(i); 34 } 35 } 36 } HashSetDemo.java 2.用集合ArrayList实现 1 package cn.itcast_02; 2 3 import java.util.ArrayList; 4 import java.util.Random; 5 6 /* 7 * 获取10个1-20之间的随机数,要求不能重复 8 * 9 * 用数组实现,但是数组的长度是固定的。 10 * 长度不好确定,所以我们使用集合实现。 11 * 12 * 分析: 13 * A:创建产生随机数的对象。 14 * B:创建一个存储随机数的集合ArrayList。 15 * C:定义一个统计变量。从0开始。 16 * D:判断统计遍历是否小于10 17 * 是:产生一个随机数,判断该随机数在集合中是否存在。 18 * 如果不存在:就添加,统计变量++。 19 * 如果存在:就不搭理它。 20 * 否:不搭理它 21 * E:遍历ArrayList集合 22 */ 23 public class ArrayListDemo { 24 public static void main(String[] args) { 25 // 创建产生随机数的对象。 26 Random r = new Random(); 27 28 // 创建一个存储随机数的集合。 29 ArrayList<Integer> array = new ArrayList<Integer>(); 30 31 // 定义一个统计变量。从0开始。 32 int count = 0; 33 34 // 判断统计遍历是否小于10 35 while (count < 10) { 36 // 产生一个随机数 37 int number = r.nextInt(20) + 1; 38 39 // 判断该随机数在集合中是否存在。 40 if (!array.contains(number)) { 41 // 如果不存在:就添加,统计变量++。 42 array.add(number); 43 count++; 44 } 45 } 46 47 // 遍历集合 48 for (Integer i : array) { 49 System.out.println(i); 50 } 51 } 52 } ArrayListDemo.java B:键盘录入5个学生信息(姓名、语文成绩、数学成绩、英语成绩),按照总分从高到低输出到控制台。 1 package cn.itcast_09; 2 3 public class Student { 4 // 姓名 5 private String name; 6 // 语文成绩 7 private int chinese; 8 // 数学成绩 9 private int math; 10 // 英语成绩 11 private int english; 12 13 public Student() { 14 super(); 15 } 16 17 public Student(String name, int chinese, int math, int english) { 18 super(); 19 this.name = name; 20 this.chinese = chinese; 21 this.math = math; 22 this.english = english; 23 } 24 25 public String getName() { 26 return name; 27 } 28 29 public void setName(String name) { 30 this.name = name; 31 } 32 33 public int getChinese() { 34 return chinese; 35 } 36 37 public void setChinese(int chinese) { 38 this.chinese = chinese; 39 } 40 41 public int getMath() { 42 return math; 43 } 44 45 public void setMath(int math) { 46 this.math = math; 47 } 48 49 public int getEnglish() { 50 return english; 51 } 52 53 public void setEnglish(int english) { 54 this.english = english; 55 } 56 57 public int getSum() { 58 return this.chinese + this.math + this.english; 59 } 60 } Student.java 1 package cn.itcast_09; 2 3 import java.util.Comparator; 4 import java.util.Scanner; 5 import java.util.TreeSet; 6 7 /* 8 * 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台 9 * 10 * 分析: 11 * A:定义学生类 12 * B:创建一个TreeSet集合 13 * C:总分从高到底如何实现呢? 14 * D:键盘录入5个学生信息 15 * E:遍历TreeSet集合 16 */ 17 public class TreeSetDemo { 18 public static void main(String[] args) { 19 // 创建一个TreeSet集合 20 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { 21 @Override 22 public int compare(Student s1, Student s2) { 23 // 总分从高到低 24 int num = s2.getSum() - s1.getSum(); 25 // 总分相同的不一定语文相同 26 int num2 = (num == 0 ? s1.getChinese() - s2.getChinese() : num); 27 // 总分和语文相同的不一定数序相同 28 int num3 = (num2 == 0 ? s1.getMath() - s2.getMath() : num2); 29 // 总分、语文和数学相同的不一定英语相同 30 int num4 = (num3 == 0 ? s1.getEnglish() - s2.getEnglish() : num3); 31 // 总分、语文、数学和英语相同的姓名还不一定相同 32 int num5 = (num4 == 0 ? s1.getName().compareTo(s2.getName()) : num4); 33 return num5; 34 } 35 }); 36 37 System.out.println("学生信息录入开始"); 38 // 键盘录入5个学生信息 39 for (int x = 1; x <= 5; x++) { 40 Scanner sc = new Scanner(System.in); 41 42 System.out.println("请输入第" + x + "个学生的姓名:"); 43 String name = sc.nextLine(); 44 45 System.out.println("请输入第" + x + "个学生的语文成绩:"); 46 String chineseString = sc.nextLine(); 47 48 System.out.println("请输入第" + x + "个学生的数学成绩:"); 49 String mathString = sc.nextLine(); 50 51 System.out.println("请输入第" + x + "个学生的英语成绩:"); 52 String englishString = sc.nextLine(); 53 54 // 把录入的数据封装到学生对象中 55 Student s = new Student(); 56 s.setName(name); 57 s.setChinese(Integer.parseInt(chineseString)); // 把字符串类型转换为int类型 58 s.setMath(Integer.parseInt(mathString)); // 把字符串类型转换为int类型 59 s.setEnglish(Integer.parseInt(englishString)); // 把字符串类型转换为int类型 60 61 // 把学生对象添加到集合 62 ts.add(s); 63 } 64 System.out.println("学生信息录入完毕"); 65 66 System.out.println("学习信息从高到低排序如下:"); 67 System.out.println("姓名\t语文成绩\t数学成绩\t英语成绩"); 68 // 遍历TreeSet集合 69 for (Student s : ts) { 70 System.out.println(s.getName() + "\t" + s.getChinese() + "\t" + s.getMath() + "\t" + s.getEnglish()); 71 } 72 } 73 } TreeSetDemo.java ----------------------------------------------------------------------------- 3:Collection集合总结(掌握) Collection |--List 有序,元素可重复 |--ArrayList 底层数据结构是数组。查询快,增删慢。 线程不安全,效率高 |--Vector 底层数据结构是数组。查询快,增删慢。 线程安全,效率低 |--LinkedList 底层数据结构是链表。查询慢,增删快。 线程不安全,效率高 |--Set 无序,元素唯一 |--HashSet 底层数据结构是哈希表。 如何保证元素唯一性的呢? 依赖两个方法:hashCode()和equals() 开发中自动生成这两个方法即可。 |--LinkedHashSet 底层数据结构是链表和哈希表。 由链表保证元素有序。 由哈希表保证元素唯一。 |--TreeSet 底层数据结构是红黑树(二叉树)。 如何保证元素排序的呢? 自然排序 比较器排序 如何保证元素唯一性的呢? 根据比较的返回值是否是0来决定。 ----------------------------------------------------------------------------- 4:针对Collection集合我们到底使用谁呢?(掌握) 元素唯一吗? 是:用Set 元素排序吗? 是:TreeSet 否:HashSet 如果你知道是用Set,但是不知道是用哪个Set,就用HashSet。 否:用List 要安全吗? 是:Vector 否:ArrayList 或者 LinkedList 查询多:ArrayList 增删多:LinkedList 如果你知道是用List,但是不知道是用哪个List,就用ArrayList。 --------------------------------------- 如果你知道是用 Collection 集合,但是不知道使用谁,就用 ArrayList。 如果你仅仅知道用集合,就用ArrayList。 由此可见,ArrayList用的最多。 ----------------------------------------------------------------------------- 5:在集合中常见的数据结构(掌握) ArrayXxx: 底层数据结构是数组,查询快,增删慢。 LinkedXxx: 底层数据结构是链表,查询慢,增删快。 HashXxx: 底层数据结构是哈希表。依赖两个方法:hashCode()和equals()。 TreeXxx: 底层数据结构是二叉树。两种方式排序:自然排序和比较器排序。============================================================================= 我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册