java 枚举应用_Java枚举应用

2023-11-18

JDK5.0开始引进了java Enum枚举类型,它可作为我们在编写代码时的一个技巧,有时恰恰因为它,我们能够"优雅而干净"地解决问题。在使用枚举类型时,我们所编写的枚举类都是隐式地继承于java.lang.Enum类,枚举类的每个成员都被隐式声明为public static final,可以通过类名称直接使用它们。

由于枚举类型本质上就是一个类,所以可以在一个独立的文件中来声明枚举值,或者在某个类中声明枚举成员。要定义枚举类型是使用enum关键词。下面就枚举的用法作一个小结:

用法一:提供常量、可用于Switch中

这是它的最基本的用法,把相关的常量定义到一个枚举类型里。

用法二:覆盖枚举的方法

我们可以覆盖枚举的方法,比如toString()方法取得枚举值的字符串描述;values()方法取得所有的枚举成员实例,并以数组方式返回;静态valueOf()方法可以让将指定的字符串尝试转换为枚举类型;使用compareTo()方法比较两个枚举值在枚举时的顺序;使用ordinal()方法得到每个枚举成员在依枚举顺序中的位置索引,默认以0开始。

用法三:构造函数

由于枚举是继承自java.lang.Enum的类,所以也可以定义构造函数,但所定义的函数不能是Public的构造函数。这是为了避免直接实例化枚举类型。注:枚举类中的静态valueOf()方法可以让将指定的字符串尝试转换为枚举类型,如下:

public class EnumClassTest {

enum OrderStatusEnum {

CREATE, PENDING, PICK, PACK, SHIPPING, COMPLETED,

};

public static void main(String[] args) {

for (String s : "CREATE ORDER".split(" ")) {

System.err.println("String is " + s);

if(s.compareTo(OrderStatusEnum.CREATE.toString()) == 0) {

OrderStatusEnum status = Enum.valueOf(OrderStatusEnum.class, s);

System.err.println("s1 == " + status.name()+", value = "+ status.ordinal() + ", " + status.toString());

System.err.println("Order is " + status);

}

}

}

}

运行结果如下:

String is CREATE

s1 == CREATE, value = 0, CREATE

Order is CREATE

String is ORDER

用法四:定义新方法,为每个enum实例赋予各自不同的行为

为每一个枚举实例定义不同的行为,我们可以定义一个或者多个抽象方法作为枚举的一部分,然后为每个枚举实例定义方法。如下:

public enum ConstantSpecificMethod {

DATE_TIME {String getInfo() {

return DateFormat.getDateInstance().format(new Date());

}},

CLASSPATH {String getInfo() {

return System.getenv("CLASSPATH");

}},

VERSION {String getInfo() {

return System.getProperty("java.version");

}};

abstract String getInfo();

public static void main(String[] args) {

for (ConstantSpecificMethod csm : values())

System.out.println(csm.getInfo());

}

}

这种方式我们很方便地使用enum来定义一个简单的状态机应用。

用法五:实现接口定义

由于枚举是继承自java.lang.Enum类,由于Java不支持多继承,所以枚举只能实现接口页不能再继承其他类。

当我们希望扩展枚举的数量或希望对枚举进行分组时,这时就可以通过在接口内定义分组的枚举,然后通过继承这个接口来使用枚举。如下:

enum SecurityCategory {

STOCK(Security.Stock.class), BOND(Security.Bond.class);

Security[] values;

SecurityCategory(Class extends Security> kind) {

values = kind.getEnumConstants();

}

interface Security {

enum Stock implements Security {

SHORT, LONG, MARGIN

}

enum Bond implements Security {

MUNICIPAL, JUNK

}

}

public Security randomSelection() {

return Enums.random(values);

}

public static void main(String[] args) {

for (int i = 0; i < 10; i++) {

SecurityCategory category = Enums.random(SecurityCategory.class);

System.out.println(category + ": " +

category.randomSelection());

}

}

}

用法六:遍历

枚举中的values方法可以获得按枚举定义顺序生成的数组,通过获得枚举中内置的整形顺序,枚举因而被历遍。如下:

public class EnumClassTest {

enum OrderStatusEnum {

CREATE, PENDING, PICK, PACK, SHIPPING, COMPLETED,

};

public static void main(String[] args) {

for (OrderStatusEnum s : OrderStatusEnum.values()) {

System.err.println(s + " ordinal: " + s.ordinal());

System.err.println(s.compareTo(OrderStatusEnum.CREATE) + " ");

System.err.println(s.equals(OrderStatusEnum.CREATE) + " ");

System.err.println(s == OrderStatusEnum.CREATE);

System.err.println(s.getDeclaringClass());

System.err.println(s.name());

System.err.println("----------------------");

}

}

}

运行结果如下:

CREATE ordinal: 0

0

true

true

class org.jevo.enusample.EnumClassTest$OrderStatusEnum

CREATE

----------------------

PENDING ordinal: 1

1

false

false

class org.jevo.enusample.EnumClassTest$OrderStatusEnum

PENDING

----------------------

PICK ordinal: 2

2

false

false

class org.jevo.enusample.EnumClassTest$OrderStatusEnum

PICK

----------------------

PACK ordinal: 3

3

false

false

class org.jevo.enusample.EnumClassTest$OrderStatusEnum

PACK

----------------------

SHIPPING ordinal: 4

4

false

false

class org.jevo.enusample.EnumClassTest$OrderStatusEnum

SHIPPING

----------------------

COMPLETED ordinal: 5

5

false

false

class org.jevo.enusample.EnumClassTest$OrderStatusEnum

COMPLETED

----------------------

枚举类型的values()方法是编译器插入到enum定义中的static方法,当将enum实例转换成父类Enum类型时,是不能访问values()方法的。但是通过Class的getEnumConstants()方法,仍然可以取得所有的enum实例。如下:

public class EnumClassTest {

enum OrderStatusEnum {

CREATE, PENDING, PICK, PACK, SHIPPING, COMPLETED,

};

public static void main(String[] args) {

for (OrderStatusEnum s : OrderStatusEnum.values()) {

OrderStatusEnum[] enus = s.getClass().getEnumConstants();

for (OrderStatusEnum s1 : enus) {

System.err.println("enus == " + s1.name()+"");

}

System.err.println("----------------------");

}

}

}

运行结果如下:

enus == CREATE

enus == PENDING

enus == PICK

enus == PACK

enus == SHIPPING

enus == COMPLETED

----------------------

enus == CREATE

enus == PENDING

enus == PICK

enus == PACK

enus == SHIPPING

enus == COMPLETED

----------------------

enus == CREATE

enus == PENDING

enus == PICK

enus == PACK

enus == SHIPPING

enus == COMPLETED

----------------------

enus == CREATE

enus == PENDING

enus == PICK

enus == PACK

enus == SHIPPING

enus == COMPLETED

----------------------

enus == CREATE

enus == PENDING

enus == PICK

enus == PACK

enus == SHIPPING

enus == COMPLETED

----------------------

enus == CREATE

enus == PENDING

enus == PICK

enus == PACK

enus == SHIPPING

enus == COMPLETED

----------------------

用法七:枚举集合的使用

两个枚举集合是 java.util.EnumSet和java.util.EnumMap。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。但是enum中不能删除添加元素。

Java SE5中EnumSet和EnumMap用于替换基于整型的位标志。位标志通常用来指示某种信息的开关量,但是在代码中是对位进行操作并不是一个有语义的概念,因而不容易被理解。EnumSet的效率比位标志要快,它在内部使用了long来表示一个位向量,然后就可以使用更加概念化的语言来表示某个位的开关,而不用担心效率。注意的是EnumSet中的元素必须来自同一个枚举。如下:

public class EnumSets {

enum AlarmPoints {STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3,OFFICE4, BATHROOM, UTILITY, KITCHEN};

public static void main(String[] args) {

EnumSet points1 = EnumSet.allOf(AlarmPoints.class); //所有元素的枚举set

System.err.println(points1);

EnumSet points = EnumSet.noneOf(AlarmPoints.class); //空Set

points.add(AlarmPoints.BATHROOM);

System.err.println(points);

points.addAll(EnumSet.of(AlarmPoints.STAIR1, AlarmPoints.STAIR2, AlarmPoints.KITCHEN));  //包含指定元素的枚举

System.err.println(points);

points = EnumSet.allOf(AlarmPoints.class);

points.removeAll(EnumSet.of(AlarmPoints.STAIR1, AlarmPoints.STAIR2, AlarmPoints.KITCHEN));

System.err.println(points);

points.removeAll(EnumSet.range(AlarmPoints.OFFICE1, AlarmPoints.OFFICE4));//包含两端范围内的所有元素的枚举set

System.err.println(points);

points = EnumSet.complementOf(points); //包含指定 set 中不 包含所有元素

System.err.println(points);

}

}

运行结果如下:

[STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY, KITCHEN]

[BATHROOM]

[STAIR1, STAIR2, BATHROOM, KITCHEN]

[LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY]

[LOBBY, BATHROOM, UTILITY]

[STAIR1, STAIR2, OFFICE1, OFFICE2, OFFICE3, OFFICE4, KITCHEN]

使用EnumMap

interface Command {

void action();

}

enum AlarmPoints {STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3,OFFICE4, BATHROOM, UTILITY, KITCHEN};

public class EnumMaps {

public static void main(String[] args) {

EnumMap em = new EnumMap(AlarmPoints.class);

em.put(AlarmPoints.KITCHEN, new Command() {

public void action() {

System.err.println("Kitchen fire!");

}

});

em.put(AlarmPoints.BATHROOM, new Command() {

public void action() {

System.err.println("Bathroom alert!");

}

});

for (Map.Entry e : em.entrySet()) {

System.err.println(e.getKey() + ": ");

e.getValue().action();

}

try { // If there's no value for a particular key:

em.get(AlarmPoints.UTILITY).action();

} catch (Exception e) {

System.err.println(e);

}

}

}

运行结果如下:

BATHROOM:

Bathroom alert!

KITCHEN:

Kitchen fire!

java.lang.NullPointerException

综合枚举应用,我们可利用枚举来设计责任链,状态机或多路分发等。

如下是一个处理邮件的实例:

class Mail {

// The NO's lower the probability of random selection:

enum GeneralDelivery {

YES, NO1, NO2, NO3, NO4, NO5

}

enum Scannability {

UNSCANNABLE, YES1, YES2, YES3, YES4

}

enum Readability {

ILLEGIBLE, YES1, YES2, YES3, YES4

}

enum Address {

INCORRECT, OK1, OK2, OK3, OK4, OK5, OK6

}

enum ReturnAddress {

MISSING, OK1, OK2, OK3, OK4, OK5

}

GeneralDelivery generalDelivery;

Scannability scannability;

Readability readability;

Address address;

ReturnAddress returnAddress;

static long counter = 0;

long id = counter++;

public String toString() {

return "Mail " + id;

}

public String details() {

return toString() + ", General Delivery: " + generalDelivery + ", Address Scanability: " + scannability + ", Address Readability: " + readability +

", Address Address: " + address + ", Return address: " + returnAddress;

}

// Generate test Mail:

public static Mail randomMail() {

Mail m = new Mail();

m.generalDelivery = Enums.random(GeneralDelivery.class);

m.scannability = Enums.random(Scannability.class);

m.readability = Enums.random(Readability.class);

m.address = Enums.random(Address.class);

m.returnAddress = Enums.random(ReturnAddress.class);

return m;

}

public static Iterable generator(final int count) {

return new Iterable() {

int n = count;

public Iterator iterator() {

return new Iterator() {

public boolean hasNext() {

return n-- > 0;

}

public Mail next() {

return randomMail();

}

public void remove() { // Not implemented

throw new UnsupportedOperationException();

}

};

}

};

}

}

public class PostOffice {

enum MailHandler {

GENERAL_DELIVERY {

boolean handle(Mail m) {

switch (m.generalDelivery) {

case YES:

System.err.println("Using general delivery for " + m);

return true;

default:

return false;

}

}

},

MACHINE_SCAN {

boolean handle(Mail m) {

switch (m.scannability) {

case UNSCANNABLE:

return false;

default:

switch (m.address) {

case INCORRECT:

return false;

default:

System.err.println("Delivering " + m + " automatically");

return true;

}

}

}

},

VISUAL_INSPECTION {

boolean handle(Mail m) {

switch (m.readability) {

case ILLEGIBLE:

return false;

default:

switch (m.address) {

case INCORRECT:

return false;

default:

System.err.println("Delivering " + m + " normally");

return true;

}

}

}

},

RETURN_TO_SENDER {

boolean handle(Mail m) {

switch (m.returnAddress) {

case MISSING:

return false;

default:

System.err.println("Returning " + m + " to sender");

return true;

}

}

};

abstract boolean handle(Mail m);

}

static void handle(Mail m) {

for (MailHandler handler : MailHandler.values())

if (handler.handle(m))

return;

System.err.println(m + " is a dead letter");

}

public static void main(String[] args) {

for (Mail mail : Mail.generator(10)) {

System.err.println(mail.details());

handle(mail);

System.err.println("*****");

}

}

}

运行结果如下:

Mail 0, General Delivery: NO2, Address Scanability: UNSCANNABLE, Address Readability: YES3, Address Address: OK1, Return address: OK1

Delivering Mail 0 normally

*****

Mail 1, General Delivery: NO5, Address Scanability: YES3, Address Readability: ILLEGIBLE, Address Address: OK5, Return address: OK1

Delivering Mail 1 automatically

*****

Mail 2, General Delivery: YES, Address Scanability: YES3, Address Readability: YES1, Address Address: OK1, Return address: OK5

Using general delivery for Mail 2

*****

Mail 3, General Delivery: NO4, Address Scanability: YES3, Address Readability: YES1, Address Address: INCORRECT, Return address: OK4

Returning Mail 3 to sender

*****

Mail 4, General Delivery: NO4, Address Scanability: UNSCANNABLE, Address Readability: YES1, Address Address: INCORRECT, Return address: OK2

Returning Mail 4 to sender

*****

Mail 5, General Delivery: NO3, Address Scanability: YES1, Address Readability: ILLEGIBLE, Address Address: OK4, Return address: OK2

Delivering Mail 5 automatically

*****

Mail 6, General Delivery: YES, Address Scanability: YES4, Address Readability: ILLEGIBLE, Address Address: OK4, Return address: OK4

Using general delivery for Mail 6

*****

Mail 7, General Delivery: YES, Address Scanability: YES3, Address Readability: YES4, Address Address: OK2, Return address: MISSING

Using general delivery for Mail 7

*****

Mail 8, General Delivery: NO3, Address Scanability: YES1, Address Readability: YES3, Address Address: INCORRECT, Return address: MISSING

Mail 8 is a dead letter

*****

Mail 9, General Delivery: NO1, Address Scanability: UNSCANNABLE, Address Readability: YES2, Address Address: OK1, Return address: OK4

Delivering Mail 9 normally

*****

一个状态机可以根据输入在有限个状态之间移动,然后在满足某种状态之后结束工作,另外每个状态都会有相应的输出,一个售货机器是一个典型的状态机的实例,如下:

enum Input { //售货机可以接收的钞票金额和所有商品的价格

NICKEL(5), //五分

DIME(10), //一角

QUARTER(25), //两角五分

DOLLAR(100),//一块

TOOTHPASTE(200), //药膏2元

CHIPS(75),   //炸薯条75美分

SODA(100),// 苏打水1元

SOAP(50), //肥皂5毛

ABORT_TRANSACTION {

public int amount() {

throw new RuntimeException("退出时不能获取余额!");

}

},

STOP {

public int amount() {

throw new RuntimeException("关机时不能获取余额!");

}

};

//金额

int value;

Input(int value) {

this.value = value;

}

Input() {

}

//返回该操作项的金额

int amount() {

return value;

}

/**

* @return 随机获取的操作

*/

public static Input randomSelection() {

return values()[new Random(System.nanoTime()).nextInt(values().length)];

}

}

enum Category { //自动售货机的状态

MONEY(Input.NICKEL, Input.DIME, Input.QUARTER, Input.DOLLAR), //放入钞票*

ITEM_SELECTION(Input.TOOTHPASTE, Input.CHIPS, Input.SODA, Input.SOAP), //选择商品

QUIT_TRANSACTION(Input.ABORT_TRANSACTION), //退出

SHUT_DOWN(Input.STOP); //关机

private Input[] values;

Category(Input... types) {

values = types;

}

public static EnumMap categories = new EnumMap(Input.class);

public Input[] getValues() {

return values;

}

//初始化自动售货机状态集合

static {

for (Category c : Category.class.getEnumConstants()) {

for (Input input : c.values) {

categories.put(input, c);

}

}

}

/**

* 返回该操作项所属状态*

*/

public static Category categorize(Input input) {

return categories.get(input);

}

}

//自动售货机:VendingMachine用来对输入进行相应,首先通过Category枚举归类输入,然后使用switch语句

public class VendingMachine {

//当前运行状态

private static State state = State.RESTING;

//当前余额

private static int amount = 0;

//当前选择商品

private static Input selection = null;

enum StateDuration { //持续状态,不能做其他操作

TRANSIENT

}

enum State { //运行状态

RESTING {

void next(Input input) {

switch (Category.categorize(input)) {

case MONEY:

amount += input.amount();

System.out.println("放入金额:" + input.amount() + "美分");

state = ADDING_MONEY;

break;

case SHUT_DOWN:

state = TERMINAL;

break;

default:

state = RESTING;

break;

}

}

},

ADDING_MONEY {  //选择商品

void next(Input input) {

switch (Category.categorize(input)) {

case MONEY:

amount += input.amount();

System.out.println("再次放入金额:" + input.amount() + "美分,您的余额是:" + amount + "美分");

break;

case ITEM_SELECTION:

selection = input;

System.out.println("选择商品:" + input);

if (amount < input.amount()) {

System.out.println("你的余额不够购买商品:" + input);

state = ADDING_MONEY;

} else state = DISPENSING;

break;

case QUIT_TRANSACTION:

state = GIVING_CHANGE;

break;

case SHUT_DOWN:

state = TERMINAL;

break;

default:

state = ADDING_MONEY;

break;

}

}

},

DISPENSING(StateDuration.TRANSIENT) { //发出商品,交易成功

void next() {

System.out.println("交易成功!请拿好您的商品:" + selection);

//扣除购买商品的金额

amount -= selection.amount();

state = GIVING_CHANGE;

}

},

GIVING_CHANGE(StateDuration.TRANSIENT) {  //找零

void next() {

if (amount > 0) {

System.out.println("请拿好您的找零:" + amount + "美分");

amount = 0;

}

state = TERMINAL;

}

},

TERMINAL { //交易终止

void output() {

System.out.println("交易结束");

}

};

private boolean isTransient = false;

public boolean isTransient() { //当前是否是瞬时状态(即不可以做其他操作)

return this.isTransient;

}

State() {

}

State(StateDuration stateDuration) {

this.isTransient = true;

}

//默认方法(在瞬时状态时做其他操作时被调用)

void next(Input input) {

System.out.println("该状态不能做其他操作!");

}

//默认方法(在非瞬时状态时不做操作时被调用)

void next() {

System.out.println("请选择一个操作!");

}

//默认方法(查看余额)

void output() {

System.out.println("您的余额还剩:" + amount + "美分");

}

}

//执行一个操作

public static void run(Input gen) {

if (state != State.TERMINAL) {

if (state.isTransient()) {

state.next();

} else {

state.next(gen);

}

} else {

state.output();

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

int i = 0;

while (true) {

switch (state) {

case RESTING:

run(Enums.random(Category.MONEY.getValues()));

break;

case ADDING_MONEY:

//如果金额不足

if (i > 0) {

run(Enums.random(Category.MONEY.getValues()));

i = 0;

} else {

run(Enums.random(Category.ITEM_SELECTION.getValues()));

i++;

}

break;

case TERMINAL:

run(Input.STOP);

return;

default:

run(null);

break;

}

}

}

}

运行结果如下:

放入金额:25美分

选择商品:CHIPS

你的余额不够购买商品:CHIPS

再次放入金额:25美分,您的余额是:50美分

选择商品:TOOTHPASTE

你的余额不够购买商品:TOOTHPASTE

再次放入金额:5美分,您的余额是:55美分

选择商品:SODA

你的余额不够购买商品:SODA

再次放入金额:5美分,您的余额是:60美分

选择商品:CHIPS

你的余额不够购买商品:CHIPS

再次放入金额:25美分,您的余额是:85美分

选择商品:SODA

你的余额不够购买商品:SODA

再次放入金额:10美分,您的余额是:95美分

选择商品:SOAP

交易成功!请拿好您的商品:SOAP

请拿好您的找零:45美分

交易结束

参考:http://www.jb51.net/article/31951.htm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 枚举应用_Java枚举应用 的相关文章

  • 带调速功能的arduino摇头避障小车

    一 材料同上篇文章 二 接线同上篇文章 L298N红板有两个使能端口ENA和ENB 这两个端口默认是有跳线帽的 也就是接5V的 此时输出就是HIGH或者LOW 摘掉跳线帽 将外边端口分别接arduino的PWM接口就好 本文接的是3和11
  • 3.[人脸识别] python-opencv 人脸特征采集与录入

    目录 1 环境 2 描述 3 代码 4 效果 1 环境 1 python 3 6 6 64bit 2 python packages 1 opencv python 3 4 1 15 2 opencv contrib python 4 4
  • 李沐动手学深度学习V2-微调练习

    1 继续提高finetune net的学习率 模型的准确性如何变化 原实验参数 lr 5e 5 batch size 128 num epochs 5 lr 5e 4 lr 5e 6 2 2 在比较实验中进一步调整finetune net和
  • 2018.5.21 . XMLSpy激活的方法

    127 0 0 1 altova com XMLspy 127 0 0 1 www altova com XMLspy 127 0 0 1 link altova com XMLspy 追加加到 C WINDOWS system32 dri
  • Python爬虫

    一 什么是代理 二 代理服务器的作用 可以进行请求的响应和转发 三 在爬虫中为何要使用代理 如果我们使用爬虫对一个网站在一段时间内发起一个高频请求 该网站会检测出这个异常的现象 并将异常的请求 IP 获取 将 IP 加入到黑名单 然后改 I
  • [无线通信基础-14]:图解移动通信技术与应用发展-2-第一代移动模拟通信大哥大

    前言 第一代移动通信主要采用的是模拟通信技术和频分多址 FDMA 技术 模拟通信 analog communication 是利用正弦波的幅度 频率或相位的变化 或者利用脉冲的幅度 宽度或位置变化来模拟原始信号 以达到通信的目的 故称为模拟
  • PyTorch中的符号索引和函数索引用法

    Pytorch中很多函数都采用的是函数式索引的思路 而且使用函数式索引对代码可读性会有很大提升 张量的符号索引 张量也是有序序列 我们可以根据每个元素在系统内的顺序位置 来找出特定的元素 也就是索引 一维张量的索引 一维张量索引与Pytho
  • 基于MATLAB的二进制数字调制与解调信号的仿真——2ASK

    实现二进制数字调制与解调信号的仿真是我的MATLAB课程设计的一部分 我参考了网上的一些资料 并加入了一些自己的想法 代码已在本地MATLAB编译通过且能正常运行 2ASK 二进制振幅键控 i 10 10个码元 j 5000 t linsp
  • java线程分析工具

    下载网站 IBM Thread and Monitor Dump Analyzer for Java TMDA 效果图
  • java8新特性-总览

    转眼真正工作的时间也一年多了 说实话虽然老板对我是肯定的 但是我对自己还是很不满意所以学习吧骚年们 Java8新特性 Java8算是java语言的一个大版本还是很有必要学习的 包括函数式编程 新的JavaScript引擎 新的日期API 新
  • 【附带配置疑问解决】Keil5配置ST-Link仿真器下载程序的方法

    0 首先需要安装好ST Link驱动 方法参阅CSDN其他文章或自行百度 1 点击魔术棒 2 选择Debug 按下图下拉框选择ST Link后 点击Settings 3 Flash Download设置如下 4 Pack设置 要把Enabl
  • 【Linux】【Ubuntu】在VMware虚拟机中安装Ubuntu18.04(UEFI启动图文教程)

    在VMware虚拟机中安装Ubuntu18 04 以UEFI方式启动 VMware 版本 15 5 以UEFI启动的Ubuntu系统安装方式与 Linux Ubuntu 在VMware虚拟机中安装Ubuntu18 04 保姆级图文教程 中记
  • BeagleBone 实施 Yocto 项目

    特点 Yocto 项目生产工具和流程 支持为嵌入式软件创建 Linux 发行版 独立于架构 BeagleBone Black 是一个平台 允许用户根据自己的喜好快速轻松地执行安装和自定义 从 Yocto Project 构建系统的基本介绍开
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 第五届蓝桥杯—— 基础练习:数列特征

    问题描述 给出n个数 找出这n个数的最大值 最小值 和 输入格式 第一行为整数n 表示数的个数 第二行有n个数 为给定的n个数 每个数的绝对值都小于10000 输出格式 输出三行 每行一个整数 第一行表示这些数中的最大值 第二行表示这些数中
  • C++11中的原子操作(atomic operation)

    所谓的原子操作 取的就是 原子是最小的 不可分割的最小个体 的意义 它表示在多个线程访问同一个全局资源的时候 能够确保所有其他的线程都不在同一时间内访问相同的资源 也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问 这有点类似互斥对象
  • AIops | 一文了解日志异常检测

    作者 李旭光 中国农业银行研发中心责编 晋兆雨出品 CSDN云计算头图 付费下载于视觉中国 背景介绍 日志是有关系统运行状态的描述 例如Linux的系统日志 数据库系统的日志以及分布式系统的日志等 日志是运维人员查看系统运行状态 寻找系统故
  • Java Eclipse进行断点调试

    如何调试Java程序 大家最开始学习Java 都会觉得IDE调试好高端有木有 其实很简单了 下文会尽量简单直观的教会你在Eclipse中调试 其他的IDE调试步骤也是类似的 1 在你觉得有错的地方设置断点 在代码行数前 点击右键 注意是右键
  • MATLAB基础语法总结

    主体参照 全网最全MATLAB学习归纳总结 建模学习必备 MATLAB讲解PPT和MATLAB官方帮助文档这里对该教程做一定的完善与汇总 1 MATLAB编辑器常用快捷键 1 1 编辑器窗口操作 编辑器窗口操作 自动整理代码 用鼠标选中代码

随机推荐

  • 【粉丝问答11】如何实现内网穿透

    本文章由网友 邓工 投稿 VX A18665908735 问题描述 起因 最近公司要做一个4G模块带GNSS 全球导航卫星系统 定位功能的产品 上传传感器数据和设备定位数据到服务器上 我们选择了simcom7600G一个支持全球通的4G模块
  • 基于Docker安装的MindSpore-1.2 GPU版本

    技术背景 在前面一篇博客中 我们介绍过MindSpore CPU版本的Docker部署以及简单的案例测试 当时官方还不支持GPU版本的Docker容器化部署 经过MindSpore团队的努力 1 2 0版本的MindSpore GPU终于推
  • XCTF攻防世界Web12道简单题

    0x00 准备 内容 在xctf官网注册账号 即可食用 目录 目录 0x01 view source2 0x02 get post3 0x03 robots4 0x04 backup6 0x05 Cookie7 0x06 disabled
  • SSE3和SSSE3 Intrinsics各函数介绍

    SIMD相关头文件包括 include
  • Linux入门篇-01 台式机安装Linux系统

    材料 台式机 U盘 内存大于8G CentOs7 下载地址 点击跳转 步骤一 U盘启动电脑 启动成功画面 选择第一个 按E 或者 Tab键 进行编辑 vmlinuz initrd initrd img inst stage2 hd LABE
  • 传感器响应时间与滤波器截止频率的关系

    1 传感器响应时间与滤波器截止频率的关系 详细看 https blog csdn net Old Street article details 108087826 2 滤波器中关于截止频率的理解 http www 360doc com co
  • 孤立森林算法(Isolation Forest Algorithm)Python实现

    孤立森林算法 Isolation Forest Algorithm Python实现 孤立森林算法是一种用于检测异常值的无监督机器学习算法 它通过构建一棵随机划分的二叉树来判断数据点的异常程度 以此来识别异常值 本文将介绍孤立森林算法的原理
  • ubuntu20.04 安装 Sophus库 slambook2

    ubuntu20 04 安装 Sophus库 slambook2 slambook2 实践部分 需要我们自行安装 sophus 库 但是相关的依赖很多 而且sophus分为模板类和非模板类两种 安装起来还是比较繁琐的 slambook2中采
  • QT在子线程发送信号给主线程,主线程信号槽函数没有反应的解决办法

    在编写线程时遇到了一个问题 即子线程发送信号给主线程 主线程信号槽函数没有反应 这个问题卡了半天 最终找到解决办法 自己记录一下 问题 在子线程的run函数发送了一个信号 在主函数中定义了一个信号槽函数用来响应这个信号 但是槽函数不执行 修
  • 我要写一篇关于酒店管理系统论文,请说一说酒店管理系统的研究背景

    酒店管理系统的研究背景是指针对旅游业和酒店业的扩大发展 以及客户服务需求的日益增加 许多酒店已经使用酒店管理系统来提高服务质量和管理效率 酒店管理系统的研究着重于通过使用软件和信息技术来有效地管理酒店的各项运营活动 从而提升酒店的服务质量
  • 机器学习之多元线性回归

    1 多元线性回归模型 定义 具有多个特征的线性回归模型 多元线性回归模型 见下图 多元线性回归总结 参数 模型 损失函数 梯度下降算法 见下图 注意 梯度下降算法每次都是同时更新wj和b 2 多维特征 多维特征 x1 x2 xn 其中xj表
  • 【Linux学习笔记】7. Linux文件IO详解(附代码实例)

    Linux文件I O 前置知识 Linux文件I O分为系统IO和标准IO 常用于系统编程 系统I O通过文件描述符 fd 来操作文件 标准I O通过文件流 FILE 来操作文件 Linux下可以使用man命令来查看使用手册 学习和使用这些
  • 数据备份技术知识梳理(建议收藏)

    所谓数据保护技术是指对当前时间点上的数据进行备份 如果说原始数据被误删除了 可以通过备份数据找回或恢复数据 从底层来分 数据保护可以分为文件级保护和块级保护 文件级备份 文件级备份 将磁盘上所有文件通过调用文件系统接口备份到另一个介质上 也
  • 11-7 读写指定大小的字节

    1 字节 一个字节 8 位 例如在 ASCII 码表中 0000 1010 表示换行 若从十六进制角度看 则结果为 0a CLion debug 便是以十六进制查看的字节 2 读字节 fread 函数用于指定字节大小的读取 该函数可读取二进
  • 重启大法好

    在做springMVC服务器的时候 出现解析不了URL 即dispatch映射不了action的时候 1 检查springname servlet xml 2 检查web xml 3 检查注解是否错误 4 重启eclipse 5 重启电脑
  • Unity3D射线检测

    射线检测主要用于像子弹是否打中物体 捡取物品等情况 本来面向百度想找例子看看 不过没找到合适的 还是自己总结尝试吧 以下测试Unity3D版本 2017 4 2f2 射线的检测步骤如下 1 Ray 这个类为了产生一个射线 如果我们想要场景中
  • Acwing 906. 区间分组

    1 将所有区间按照左端点从小到大排序 2 从前往后处理每个区间 判断能否将其放到某个现有的组中 L i gt Max r 1 如果不存在这样的组 则开新组 然后将其放进去 2 如果存在这样的组 将其放进去 并更新当前组的Max r incl
  • cocoscreator 3.x 获取像素颜色

    const pos v2 世界坐标 const color as camera rt targetTexture readPixels pos v2 x pos v2 y 1 1 获得颜色 cc color color as 0 color
  • BeautifulSoup4(bs4)

    BeautifulSoup4是一个高效的网页解析库 可以从HTML或XML文件中提取数据 支持不同的解析器 比如 对HTML解析 对XML解析 对HTML5解析 就是一个非常强大的工具 爬虫利器 一个灵感又方便的网页解析库 处理高效 支持多
  • java 枚举应用_Java枚举应用

    JDK5 0开始引进了java Enum枚举类型 它可作为我们在编写代码时的一个技巧 有时恰恰因为它 我们能够 优雅而干净 地解决问题 在使用枚举类型时 我们所编写的枚举类都是隐式地继承于java lang Enum类 枚举类的每个成员都被