掌握Guava字符处理工具:让你的代码更易读、高效

 

推荐语

请允许我自夸一下,这确实是一篇精彩的技术文章,它深入介绍了Guava类库中强大的字符串处理工具。通过本文,你将了解如何巧妙运用这些工具来简化字符串操作、提高代码可读性和性能。不论是字符串拼接、分割、替换还是正则表达式匹配,Guava都提供了丰富的功能和灵活的应用场景。无论您是Java开发者还是对字符串处理感兴趣的技术爱好者,本文将带你领略Guava字符串处理工具的神奇之处,助您掌握高效、优雅的文本操作技巧。

关于Guava的字符处理工具

Guava 提供了丰富的字符处理工具类,让你能够轻松进行字符匹配、转换、拆分、连接和转义等各种操作。这些实用工具类不仅提供了常见的字符处理功能,而且还为你提供了更高效、更简洁的方式来处理字符串。无论是需要对字符串进行灵活的匹配和过滤,还是需要对字符串进行快速的连接和拆分,Guava 的字符处理工具类都能满足你的需求。无需编写繁琐的逻辑代码,你可以直接使用这些工具类来完成各种字符处理任务,让你的代码更加清晰、简洁和易于维护。无论是在日常开发中还是在处理大量文本数据时,Guava 的字符处理工具类都能够为你提供便利,助力你更高效地处理字符串。

Guava的字符处理工具盘点

  • CharMatcher:用于进行字符匹配和过滤的工具类。可以使用预定义的匹配器(如数字、字母、空格等)或自定义匹配器进行字符操作。
  • CaseFormat:用于不同命名风格(如驼峰、下划线等)之间的转换。提供了多种常见的命名风格格式,并支持自定义格式。
  • Strings:提供了一些常见的字符串操作方法,如判空、截取、填充等。包括处理字符串是否为空或 null、填充字符串、截取前几个字符、将 null 转换为空字符串等方法。
  • Splitter:用于拆分字符串为指定格式的迭代器。可以按照指定的分隔符、正则表达式或固定长度等方式进行字符串的拆分。
  • Joiner:用于连接多个字符串为一个字符串。可以指定连接符、跳过 null 值等。
  • Ascii:提供了对 ASCII 字符的常见操作,如大小写转换、判断字符是否为数字或字母等。
  • Chars:提供了对 char 类型的常见操作,如将 char 数组转换为字符串、查找字符等。
  • HtmlEscapers:用于转义 HTML 字符串中的特殊字符,防止 XSS 攻击。
  • XmlEscapers:用于转义 XML 字符串中的特殊字符,防止 XXE 攻击。

Guava的字符串工具如何使用

CharMatcher

CharMatcher类提供了一组方法,用于处理和操作字符。它可以用于字符匹配、修剪、移除、保留等操作,具体如下:

  • 字符匹配:CharMatcher可以用来确定一个字符是否匹配某个条件。例如,可以使用isDigit()方法判断一个字符是否为数字字符,或使用isWhitespace()方法判断一个字符是否为空白字符。
@Test
public void test() {
    char character = '9';
    // 判断字符是否为数字字符
    boolean isDigit = CharMatcher.digit().matches(character);
    System.out.println(isDigit);  // 输出: true
    String text = "   Hello World!   ";
    // 判断字符是否为空白字符
    boolean isWhitespace = CharMatcher.whitespace().matchesAnyOf(text);
    System.out.println(isWhitespace);  // 输出: true
}
  • 字符修剪:CharMatcher可以用来修剪字符串中的字符。例如,可以使用trimFrom()方法删除字符串开头和结尾的匹配字符,或使用collapseFrom()方法将连续重复的匹配字符替换为单个字符。
@Test
public void test2(){
    String text = "   Hello World!   ";
    // 删除字符串开头和结尾的空白字符
    String trimmedText = CharMatcher.whitespace().trimFrom(text);
    System.out.println(trimmedText);  // 输出: Hello World!
    String repeatedText = "aaaabbbcccc";
    // 将连续重复的字符替换为单个字符
    String collapsedText = CharMatcher.is('a').collapseFrom(repeatedText, '-');
    System.out.println(collapsedText);  // 输出: -bbbcccc
}
  • 字符移除:CharMatcher可以用来移除字符串中的特定字符。例如,可以使用removeFrom()方法删除字符串中所有匹配的字符,或使用retainFrom()方法保留字符串中与给定条件匹配的字符,而删除其他字符。
@Test
public void test3(){
    String text = "Hello World!";
    // 删除字符串中所有的字母字符
    String removedText = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')).removeFrom(text);
    System.out.println(removedText);  // 输出:  !
    // 保留字符串中的数字字符,删除其他字符
    String retainedText = CharMatcher.digit().retainFrom(text);
    System.out.println(retainedText);  // 输出:
}

}

  • 字符替换:CharMatcher可以用来替换字符串中的字符。例如,可以使用replaceFrom()方法将字符串中所有匹配的字符替换为指定的字符。
@Test
public void test4(){
    String text = "Hello World!";
    // 将字符串中所有的空格替换为逗号
    String replacedText = CharMatcher.whitespace().replaceFrom(text, ',');
    System.out.println(replacedText);  // 输出: Hello,World!
}
  • 字符统计:CharMatcher可以用来统计字符串中匹配的字符数量。例如,可以使用countIn()方法计算字符串中匹配字符的出现次数。
@Test
public void test5() {
    String text = "Hello World!";
    // 计算字符串中匹配字符的出现次数
    int count = CharMatcher.is('o').countIn(text);
    System.out.println(count);  // 输出: 2
}

CaseFormat

Guava中的CaseFormat类是一个枚举类型,用于在不同的命名约定之间进行格式转换。

CaseFormat类提供了一组方法,用于将字符串从一种命名约定转换为另一种命名约定。它支持以下几种常见的命名约定:

  • LOWER_CAMEL:小驼峰命名法,例如:lowerCamel
  • UPPER_CAMEL:大驼峰命名法,也称为帕斯卡命名法,例如:UpperCamel
  • LOWER_UNDERSCORE:下划线命名法,例如:lower_underscore
  • UPPER_UNDERSCORE:大写下划线命名法,例如:UPPER_UNDERSCORE

CaseFormat类提供了以下主要方法:

  • to(CaseFormat targetFormat, CharSequence original):将原始字符串按照指定的目标格式进行转换。
  • converterTo(CaseFormat targetFormat):返回一个函数,用于将字符串从当前格式转换为目标格式。

下面是使用CaseFormat类的示例代码:

@Test
public void test2(){
    String original = "hello_world";
    // 将下划线命名法转换为小驼峰命名法
    String lowerCamel = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, original);
    System.out.println(lowerCamel);  // 输出: helloWorld
    // 将小驼峰命名法转换为大写下划线命名法
    String upperUnderscore = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, lowerCamel);
    System.out.println(upperUnderscore);  // 输出: HELLO_WORLD
}

在上述示例中,首先将一个字符串从下划线命名法转换为小驼峰命名法,然后再将小驼峰命名法转换为大写下划线命名法,最终输出结果。

Strings

Google Guava库中的Strings类提供了一些用于处理字符串的实用方法。它包含了一系列静态方法,用于执行字符串的操作和转换。

以下是Strings类的一些常见用法示例:

  • 判断字符串是否为空或者为空白字符:
@Test
public void test8() {
    String str1 = "";
    String str2 = null;
    String str3 = "  ";
    boolean isEmpty1 = Strings.isNullOrEmpty(str1);
    System.out.println(isEmpty1);  // 输出: true
    boolean isEmpty2 = Strings.isNullOrEmpty(str2);
    System.out.println(isEmpty2);  // 输出: true
    boolean isBlank = Strings.isNullOrEmpty(str3);
    System.out.println(isBlank);  // 输出: true
}
  • 获取字符串的长度,如果为null则返回0:
@Test
public void test9() {
    String str = "Hello World!";
    int length = Strings.nullToEmpty(str).length();
    System.out.println(length);  // 输出: 12
    String nullStr = null;
    int nullLength = Strings.nullToEmpty(nullStr).length();
    System.out.println(nullLength);  // 输出: 0
}
  • 填充字符串到指定长度,如果长度不够,则在左侧或右侧添加指定字符:
@Test
public void test10() {
    String str = "123";
    String paddedLeft = Strings.padStart(str, 10, '0');
    System.out.println(paddedLeft);  // 输出: 0000000123
    String paddedRight = Strings.padEnd(str, 10, '0');
    System.out.println(paddedRight);  // 输出: 1230000000
}
  • 用于查找两个字符串之间的最长公共前缀。如果没有公共前缀,则返回空字符串。在下面的示例中,比较了两对字符串(str1和str2,以及str3和str4)之间的最长公共前缀。第一对字符串有公共前缀"Hello",而第二对字符串没有公共前缀,因此返回了空字符串。
@Test
public void test11() {
    String str1 = "Hello World!";
    String str2 = "Hello Java!";
    String commonPrefix = Strings.commonPrefix(str1, str2);
    System.out.println(commonPrefix);  // 输出: Hello
    String str3 = "Goodbye World!";
    String str4 = "Hello Java!";
    String noCommonPrefix = Strings.commonPrefix(str3, str4);
    System.out.println(noCommonPrefix);  // 输出:
}

Splitter

Splitter类是Google Guava库中的一个实用工具类,用于将字符串拆分成多个部分。它提供了一些方法来定义分隔符、处理空白项、限制拆分数量等。主要作用:

  • 字符串拆分:通过指定分隔符将字符串拆分成多个部分。可以使用多种不同的分隔符,包括固定字符串、正则表达式、字符匹配器等。在下面的示例中,使用逗号,作为分隔符将字符串str拆分成多个部分;
@Test
public void test12() {
    String str = "One,Two,Three";
    Iterable<String> parts = Splitter.on(',')
            .split(str);
    for (String part : parts) {
        System.out.println(part);
    }
}
  • 过滤空白项:可以过滤掉拆分结果中的空白项,例如连续的分隔符、拆分后的空字符串等。在下面的示例中,使用逗号,作为分隔符将字符串str拆分成多个部分。使用omitEmptyStrings()方法过滤掉空字符串,使用trimResults()方法去除每个部分的前导和尾随空白。
@Test
public void test13() {
    String str = "One,,Two, , Three";
    Iterable<String> parts = Splitter.on(',')
            .omitEmptyStrings()
            .trimResults()
            .split(str);
    for (String part : parts) {
        System.out.println(part);
    }
}
  • 限制拆分数量:可以设置最大拆分数量,仅将字符串拆分为指定数量的部分。在下面的示例中,使用逗号,作为分隔符将字符串str拆分成多个部分。使用limit(3)方法将拆分部分的数量限制为3个。
@Test
public void test14() {
    String str = "One,Two,Three,Four,Five";
    Iterable<String> parts = Splitter.on(',')
            .limit(3)
            .split(str);
    for (String part : parts) {
        System.out.println(part);
    }
}

Joiner

Joiner类是Google Guava库中的一个实用工具类,用于将多个对象或元素连接成一个字符串。它提供了一些方法来定义连接符、处理空值、跳过Null值等。主要作用如下:

  • 对象连接:将多个对象或元素连接成一个字符串。可以连接任意类型的对象,包括基本数据类型、集合、数组等。在下面的示例中,使用Joiner将字符串数组names中的元素连接成一个字符串,每个元素之间使用逗号和空格分隔。
@Test
public void test15() {
    String[] names = {"Alice", "Bob", "Charlie"};
    String result = Joiner.on(", ")
            .join(names);
    System.out.println(result);
}
  • 处理空值:可以定义在连接过程中如何处理空值。可以选择跳过空值、将其视为普通字符串、使用自定义占位符代替空值等。在下面的示例中,使用Joiner将字符串数组names中的元素连接成一个字符串,每个元素之间使用逗号和空格分隔。使用useForNull("Unknown")方法将空值替换为自定义的占位符"Unknown"。
@Test
public void test16() {
    String[] names = {"Alice", "Bob", null, "Charlie"};
    String result = Joiner.on(", ")
            .useForNull("Unknown")
            .join(names);
    System.out.println(result);
}
  • 跳过Null值:可以选择跳过Null值,不包含在最终的连接结果中。在下面的示例中,使用Joiner将字符串列表names中的元素连接成一个字符串,每个元素之间使用逗号和空格分隔。使用skipNulls()方法跳过空值。
@Test
public void test17() {
    List<String> names = Lists.newArrayList("Alice", "Bob", null, "Charlie");
    String result = Joiner.on(", ")
            .skipNulls()
            .join(names);
    System.out.println(result);
}

Ascii

Ascii类是Google Guava库中的一个实用工具类,提供了一些对ASCII字符的处理方法。它可以帮助您处理和转换ASCII字符,执行ASCII字符相关的操作。Ascii类的主要作用如下:

  • 字符判断:Ascii类提供了一系列的方法来进行ASCII字符的判断。例如,isLowerCase(char)用于判断字符是否为小写字母,isUpperCase(char)用于判断字符是否大写字母等。在下面示例中,使用Ascii类的方法判断字符ch是否为小写字母、大写字母。
@Test
public void test1() {
    char ch = 'a';
    boolean isLowerCase = Ascii.isLowerCase(ch);
    boolean isUpperCase = Ascii.isUpperCase(ch);
    System.out.println("Is lowercase? " + isLowerCase);
    System.out.println("Is isUpperCase? " + isUpperCase);
}
  • 字符转换:Ascii类提供了一些方法来进行ASCII字符的转换。例如,toUpperCase(char)用于将字符转换为大写形式,toLowerCase(char)用于将字符转换为小写形式,toChar(int)用于将ASCII码转换为字符等。在下面示例中,使用Ascii类的方法将字符ch转换为大写形式和小写形式。
@Test
public void test2() {
    char ch = 'a';
    char upperCaseCh = Ascii.toUpperCase(ch);
    char lowerCaseCh = Ascii.toLowerCase(ch);
    System.out.println("Uppercase character: " + upperCaseCh);
    System.out.println("Lowercase character: " + lowerCaseCh);
}
  • 字符处理:Ascii类还提供了一些处理ASCII字符的方法。例如,truncate(CharSequence, int, CharSequence)用于截断字符串并在末尾添加截断标记,wrap(CharSequence, int)用于在指定的宽度处将字符串拆分为多行等。在下面示例中,使用Ascii类的方法对字符串text进行处理。truncate(CharSequence, int, CharSequence)方法用于截断字符串并在末尾添加截断标记。
@Test
public void test3() {
    String text = "Hello, World!";
    String truncatedText = Ascii.truncate(text, 10, "...");
    System.out.println("Truncated text: " + truncatedText);
}

Chars

Chars类是Guava库中提供的一个工具类,用于操作基本类型char的相关方法。以下是该类的一些常用核心方法:

  • asList(char...):将char数组转换为不可变列表(ImmutableList)。
@Test
public void test4() {
    List<Character> charList = Chars.asList('a', 'b', 'c');
    System.out.println(charList.toString());
}
  • compare(char, char):比较两个char值的大小,返回一个整数值。
@Test
public void test5() {
    int compareResult = Chars.compare('a', 'b');
    System.out.println(compareResult);
}
  • concat(char[]...):连接多个char数组为一个新的数组。
@Test
public void test6() {
    char[] result = Chars.concat(new char[]{'a', 'b'}, new char[]{'c', 'd'});
    System.out.println(result);
}
  • contains(char[], char):检查一个char值是否在数组中。
@Test
public void test6() {
    char[] result = Chars.concat(new char[]{'a', 'b'}, new char[]{'c', 'd'});
    System.out.println(result);
}
  • indexOf(char[], char):查找指定char值在数组中的索引,若不存在则返回-1。
@Test
public void test8() {
    int index = Chars.indexOf(new char[]{'a', 'b', 'c'}, 'b');
    System.out.println(index);
}
  • join(String, char...):使用指定的分隔符将char数组连接为字符串。
@Test
public void test9() {
    String joinedString = Chars.join(",", 'a', 'b', 'c'); // "a,b,c"
    System.out.println(joinedString);
}
  • max(char...):返回最大的char值。
@Test
public void test10() {
    char maxChar = Chars.max('a', 'b', 'c');
    System.out.println(maxChar);
}
  • min(char...):返回最小的char值。
@Test
public void test11() {
    char minChar = Chars.min('a', 'b', 'c');
    System.out.println(minChar);
}
  • toArray(Collection):将Character集合转换为char数组。
@Test
public void test12() {
    Character[] characters = { 'a', 'b', 'c' };
    char[] charArray = Chars.toArray(Arrays.asList(characters));
    System.out.println(charArray);
}

HtmlEscapers

HtmlEscapers类是Guava库中提供的一个实用工具类,用于将文本中的HTML特殊字符进行转义(escape)。其主要作用是防止在HTML页面中展示文本时,出现被误认为是HTML标签的风险,从而避免潜在的安全问题和错误的展示效果。

HtmlEscapers#htmlEscaper():获取一个将HTML特殊字符进行转义的Escaper对象。在下面的示例中,先获取一个Escaper对象,然后调用Escaper#escape()对html文本进行转义;

@Test
public void test13() {
    String escapedText = HtmlEscapers.htmlEscaper().escape("<script>alert('Hello World');</script>");
    System.out.println(escapedText);
}

XmlEscapers

XmlEscapers是Google Guava库中的一个类,提供了一种方便的方式来处理XML文本中的特殊字符,确保文本在显示或存储时的正确性。其主要就是对XML文本进行转义:

转义XML特殊字符:XmlEscapers.xmlContentEscaper()方法返回一个Escaper对象,通过调用该对象的escape(String)方法,可以将XML文本中的特殊字符(如, &, ", '等)替换为相应的XML实体编码。例如:XmlEscapers.xmlContentEscaper().escape("Hello & World!")将返回Hello & World!。

@Test
public void test14() {
    // 转义XML特殊字符
    String xmlText = "<root>Hello &amp; World!</root>";
    Escaper escaper = XmlEscapers.xmlContentEscaper();
    String escapedText = escaper.escape(xmlText);
    System.out.println("Escaped Text: " + escapedText);
}

写在最后

在软件开发中,处理字符是一项常见而重要的任务。而如果你正在寻找一款功能强大、易于使用的字符处理工具,那么不妨关注一下Google Guava库中的字符工具。本文为你详细介绍Guava库中字符工具的使用方法,让你在处理字符相关的业务时X游刃有余。无论你是初学者还是有经验的开发者,这篇文章都会帮助你更好地理解和应用Guava库中的字符工具,如果觉得篇文章还不错,不妨给这篇文章点赞和关注,给我一些鼓励,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/249906.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IT 人员与加密程序:如何战胜病毒

&#x1f510; 加密程序是攻击者在成功攻击组织时使用最多的恶意软件类型。它们通常会发送到一个庞大的电子邮件地址数据库&#xff0c;看起来像 Word 或 Excel 文档或 PDF 文件。 想象一下&#xff0c;你是会计部门的一名员工。这种格式的文件在电子文档管理系统中被广泛使用…

心理测试网站源码,知己心理React心理健康测试

源码介绍 React心理健康测试网站源码&#xff0c;帮助需要的人更好地了解自已的心理健康状态和人格特征。 React可以在Vite中启用HMR&#xff0c;并且包含了几人EsLint规则。只需要使用react antd-mobile即可 轻松部署完成。

美团赚钱更难了,Q3核心业务利润率下降2%,市值一年缩水近6000亿

从“买菜”卷向“超市”&#xff0c;成立5年的美团买菜更名为“小象超市”。 就在更名公告发布的前一天&#xff0c;美团公布了2023年三季报&#xff0c;尽管三季度营收净利双增长&#xff0c;但其股价却呈相反趋势。 三季报发布次日(11月29日)&#xff0c;美团港股股价单日跌…

离线云渲染有什么好用的平台?离线云渲染好用吗?

云渲染是一种在云端计算平台上执行的3D渲染任务处理方式&#xff0c;让CG制作者不必依靠本地硬件的计算力。它与传统的离线渲染有着相似之处——都不需要即时生成渲染结果&#xff0c;并且可能需要等待一段时间才能获取最终图像。不过&#xff0c;云渲染利用了云计算提供的分布…

外包干了3年,技术退步明显。。。

前言 简单说下我的情况吧&#xff01;普通本科的科班生&#xff0c;19年的时候通过校招进了一家小自研&#xff0c;工资还凑合&#xff0c;在里面带了一年多&#xff0c;公司没了&#xff0c;疫情期间找工作很麻烦&#xff0c;后面就开始自己近3年的外包生涯&#xff0c;这三年…

讯飞星火大模型api调用

讯飞星火大模型&#xff0c;通过websocket方式通信传递协议要求的报文&#xff0c;然后将流式返回的报文拼接为完整的响应内容&#xff0c;status2时是最后一条消息。因为是websocket方式所以是异步响应的&#xff0c;如果想要同步需要使用CountDownLatch控制下线程等待最后一条…

57.Go操作ES(官方提供github.com/elastic/go-elasticsearch库)

文章目录 一、简介1、安装依赖2、导入依赖3、连接 ES 二、操作索引三、model定义四、操作文档1、创建文档2、根据文档唯一ID获取指定索引下的文档3、检索 document1、 检索全部文档2、 模糊条件检索3、聚合检索 4、更新文档5、删除文档6、文档操作完整代码 代码地址&#xff1a…

数据结构与算法之美学习笔记:36 | AC自动机:如何用多模式串匹配实现敏感词过滤功能?

目录 前言基于单模式串和 Trie 树实现的敏感词过滤经典的多模式串匹配算法&#xff1a;AC 自动机解答开篇内容小结 前言 本节课程思维导图&#xff1a; 很多支持用户发表文本内容的网站&#xff0c;比如 BBS&#xff0c;大都会有敏感词过滤功能&#xff0c;用来过滤掉用户输入…

论文阅读:PointCLIP V2: Prompting CLIP and GPT for Powerful3D Open-world Learning

https://arxiv.org/abs/2211.11682 0 Abstract 大规模的预训练模型在视觉和语言任务的开放世界中都表现出了良好的表现。然而&#xff0c;它们在三维点云上的传输能力仍然有限&#xff0c;仅局限于分类任务。在本文中&#xff0c;我们首先协作CLIP和GPT成为一个统一的3D开放世…

使用 TensorFlow 创建生产级机器学习模型(基于数据流编程的符号数学系统)——学习笔记

资源出处&#xff1a;初学者的 TensorFlow 2.0 教程 | TensorFlow Core (google.cn) 前言 对于新框架的学习&#xff0c;阅读官方文档是一种非常有效的方法。官方文档通常提供了关于框架的详细信息、使用方法和示例代码&#xff0c;可以帮助你快速了解和掌握框架的使用。 如…

关于 Redis 与传统关系型数据库的选择

当需要为你的应用程序选择合适的数据库时&#xff0c;选择何种数据库通常取决于你项目的特定要求。Redis 是一种高性能的内存数据存储&#xff0c;而 MySQL 等传统关系型数据库也各自具有自己的优势和劣势。在本期文章中&#xff0c;我们将探讨在 Redis 和传统关系型数据库之间…

C++面向对象(OOP)编程-运算符重载

本文主要介绍C面向对象编程中的多态的手段之一运算符重载&#xff0c;讲清运算符重载的本质&#xff0c;以及通过代码实现一些常用的运算符重载。 目录 1 运算符重载的本质 2 运算符重载格式 3 运算符重载分类 3.1 重载为类的成员函数 3.1.1 双目运算符重载 3.1.2 单目运…

Faulhaber 2.5代运动控制系统 25mNm/13W

2.5代控制系统&#xff1b; PWM输出&#xff1b; 四象限控制带&#xff1b; RS232或CANopen通信接口&#xff1b; 2250_BX4_CxD 选件&#xff0c;电缆和连接信息&#xff1a; 适配部件&#xff1a;

Java-File类与IO流(1)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

在4*4的平面上计算2a1+1+1

0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 在4*4的平面上有2个点&#xff0c;保持2a1的结构&#xff0c;然后向剩余的14个格子里随机扔2个石子。 共有14*13/291种可能 1 - - - 2 - - - 3 - - 1 4 - - - 1 1 - 1 1 - - - - - - - 1 - - …

Python个人代码随笔(观看无益,请跳过)

异常抛错&#xff1a;一般来说&#xff0c;在程序中&#xff0c;遇到异常时&#xff0c;会从这一层逐层往外抛错&#xff0c;一直抛到最外层&#xff0c;由最外层把错误显示在用户终端。 try:raise ValueError("A value error...") except ValueError:print("V…

IS-IS原理与配置3

IS-IS原理与配置 • IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP &#xff08;ConnectionL…

FGSM、PGD、BIM对抗攻击算法实现

本篇文章是博主在AI、无人机、强化学习等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学…

Unity中 URP Shader 的纹理与采样器的分离定义

文章目录 前言一、URP Shader 纹理采样的实现1、在属性面板定义一个2D变量用于接收纹理2、申明纹理3、申明采样器4、进行纹理采样 二、申明纹理 和 申明采样器内部干了什么1、申明纹理2、申明采样器 三、采样器设置采样器的传入格式1、纹理设置中&#xff0c;可以看见我们的采样…

vue脚手架安装及使用

准备工作 安装node安装cnpm cnpm是npm的“廉价平替” 提高安装速度 npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装脚手架 安装Vue脚手架 cnpm install -g vue/cli 用vue脚手架创建vue项目 找好创建项目的位置 创建项目 vue create test (test为项…
最新文章