GVKun编程网logo

如果我在Java中省略花括号可以吗?(java省略this)

25

以上就是给各位分享如果我在Java中省略花括号可以吗?,其中也会对java省略this进行解释,同时本文还将给你拓展2023-07-13:如果你熟悉Shell编程,那么一定了解过花括号展开,它可以用来

以上就是给各位分享如果我在Java中省略花括号可以吗?,其中也会对java省略this进行解释,同时本文还将给你拓展2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串 定义下面几条语、c – 如果我在清楚的情况下使用指针,编译器可以内联虚函数吗?、java - 在java中使用snakeyaml写入yaml时,我可以只删除大括号吗、JavaScript使用“ new”运算符创建对象时,我们可以省略括号吗?等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如果我在Java中省略花括号可以吗?(java省略this)

如果我在Java中省略花括号可以吗?(java省略this)

我已经搜索过了,但是找不到答案,无论出于什么原因,我都感到羞耻,无法问教授,因为那种感觉当成千上万的人盯着你看时…

无论如何,我的问题是使用括号的重要性是什么?如果我省略它们可以吗?例:

for (int i = 0; i < size; i++)  {   a += b;}

for (int i = 0; i < size; i++)   a += b;

我知道它们都可以使用,但是如果省略括号(由于能见度,我倾向于做很多事情)会改变任何东西吗?正如我说的,我知道它有效,我测试了数十次,但是现在我的一些单项作业越来越大,出于某种原因,我出于非理性的恐惧,从长远来看,这会引起一些问题吗?有理由担心吗?

答案1

小编典典

除了代码的可维护性之外,它根本不会改变任何东西。我看过这样的代码:

for (int i = 0; i < size; i++)   a += b;   System.out.println("foo");这意味着:for (int i = 0; i < size; i++)   a += b;System.out.println("foo");

…但是应该是这样的:

for (int i = 0; i < size; i++) {   a += b;   System.out.println("foo");}

我个人总是将方括号括起来,以减少在阅读或修改代码时造成混淆的可能性。

我工作过的每家公司的编码约定都要求这样做-并不是说其他​​一些公司没有不同的约定…

以防万一,您认为这永远不会有所作为:我不得不修复一次错误,该错误与上面的代码相当。很难发现……(诚然,这是几年前,在我开始进行单元测试之前,毫无疑问,这使诊断变得更加容易)。

2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串 定义下面几条语

2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串 定义下面几条语

2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。

花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串

定义下面几条语法规则:

如果只给出单一的元素 x,那么表达式表示的字符串就只有 "x"。R (x) = {x}

例如,表达式 "a" 表示字符串 "a"。

而表达式 "w" 就表示字符串 "w"。

当两个或多个表达式并列,以逗号分隔,我们取这些表达式中元素的并集

R({e_1,e_2,...}) = R(e_1) ∪ R(e_2) ∪ ...

例如,表达式 "{a,b,c}" 表示字符串 "a","b","c"。

而表达式 "{{a,b},{b,c}}" 也可以表示字符串 "a","b","c"。

要是两个或多个表达式相接,中间没有隔开时,

我们从这些表达式中各取一个元素依次连接形成字符串

R(e_1 + e_2) = {a + b for (a, b) in R(e_1) × R(e_2)}

例如,表达式 "{a,b}{c,d}" 表示字符串 "ac","ad","bc","bd"。

表达式之间允许嵌套,单一元素与表达式的连接也是允许的。

例如,表达式 "a {b,c,d}" 表示字符串 "ab","ac","ad"​​​​​​。

例如,表达式 "a {b,c}{d,e} f {g,h}"

可以表示字符串 :

"abdfg", "abdfh", "abefg", "abefh",

"acdfg", "acdfh", "acefg", "acefh"。

给出表示基于给定语法规则的表达式 expression。

返回它所表示的所有字符串组成的有序列表。

输入:expression = "{a,b}{c,{d,e}}"。

输出:["ac","ad","ae","bc","bd","be"]。

答案 2023-07-13:

大体步骤如下:

1. 定义了一个结构体 Info,其中包含一个 treeset.Set 类型的指针 ans 和一个整数 end

2. 定义了一个 NewInfo 函数,用于初始化 Info 对象。

3. 定义了 braceExpansionII 函数,接收一个表示表达式的字符串,并返回展开后的字符串列表。

4.process 函数是实际处理展开过程的核心函数,它接收一个表示表达式的字符数组 exp 和一个起始索引 start,返回一个 Info 对象。

5. 在 process 函数中,创建了一个空的 treeset.Set 对象 ans 和一个空的 []*treeset.Set 切片 parts

6. 使用 strings.Builder 创建了一个字符串构建器 builder

7. 在循环中,依次遍历 exp 中的字符,直到遇到 } 或到达字符串末尾为止。

8. 如果当前字符为 {,则调用 addStringToParts 函数将构建器中的字符串添加到 parts 中,并递归调用 process 函数处理 {} 内部的表达式,将返回的 ans 添加到 parts 中,并更新起始索引 start

9. 如果当前字符为 ,,则调用 addStringToParts 函数将构建器中的字符串添加到 parts 中,并将 parts 中的所有集合添加到 ans 中,然后清空 parts,并更新起始索引 start

10. 如果当前字符为小写英文字母,则将其添加到构建器中。

11. 循环结束后,调用 addStringToParts 函数将构建器中的最后一个字符串添加到 parts 中。

12. 调用 addPartsToSet 函数将 parts 中的所有集合添加到 ans 中。

13. 返回包含 ans 和起始索引 startInfo 对象。

14.addStringToParts 函数将构建器中的字符串添加到 parts 中,如果构建器不为空,则创建一个新的 treeset.Set 对象,并将字符串添加到集合中,再将集合添加到 parts 中。

15.addPartsToSet 函数将 parts 中的所有集合进行组合并添加到 ans 中。

16.processParts 函数是递归处理 parts 切片的核心函数。如果索引 i 等于 parts 的长度,则表示已经处理完所有集合,将连接后的字符串添加到 ans 中。否则,取出当前集合,遍历集合中的每个元素,与 path 进行连接,并递归调用 processParts 处理下一个集合。

17.toSlice 函数将 ans 中的元素转换为有序字符串切片,并返回该切片。

18. 在 main 函数中,定义了一个表达式字符串 expression,并调用 braceExpansionII 函数对表达式进行展开,并将结果打印输出。

该代码的时间复杂度为 $O (N^M)$,其中 N 为表达式中的字符数,M 为展开括号的深度。具体来说,代码中的核心函数 process 通过遍历表达式字符并进行递归处理,每次递归都会将问题规模缩小,直到达到展开括号的最深层级。因此,时间复杂度取决于表达式中字符的数量以及展开括号的深度。

空间复杂度是 $O (N^M)$,其中 N 为表达式中的字符数,M 为展开括号的深度。在代码执行过程中,会创建一些辅助数据结构,如字符串构建器和集合。对于集合这种动态数据结构,其占用的内存空间与展开括号的深度呈指数关系。而字符串构建器的空间复杂度与表达式中字符的数量成线性关系。因此,最终的空间复杂度取决于展开括号的深度和表达式中字符的数量,即 $O (N^M)$。

go 完整代码如下:

package main

import (
	"fmt"
	"strings"

	"github.com/emirpasic/gods/sets/treeset"
)

type Info struct {
	ans *treeset.Set
	end int
}

func NewInfo(a *treeset.Set, e int) *Info {
	ans := &Info{}
	ans.ans = a
	ans.end = e
	return ans
}

func braceExpansionII(expression string) []string {
	ans := process([]rune(expression), 0).ans
	return toSlice(ans)
}

func process(exp []rune, start int) *Info {
	ans := treeset.NewWith(func(a, b interface{}) int {
		aa := a.(string)
		bb := b.(string)
		if aa < bb {
			return -1
		} else if aa == bb {
			return 0
		} else {
			return 1
		}
	})
	parts := make([]*treeset.Set, 0)
	builder := strings.Builder{}

	for start < len(exp) && exp[start] != ''}'' {
		if exp[start] == ''{'' {
			addStringToParts(&builder, &parts)
			next := process(exp, start+1)
			parts = append(parts, next.ans)
			start = next.end + 1
		} else if exp[start] == '','' {
			addStringToParts(&builder, &parts)
			addPartsToSet(ans, &parts)
			start++
			parts = make([]*treeset.Set, 0)
		} else {
			builder.WriteRune(exp[start])
			start++
		}
	}

	addStringToParts(&builder, &parts)
	addPartsToSet(ans, &parts)
	return &Info{ans, start}
}

func addStringToParts(builder *strings.Builder, parts *[]*treeset.Set) {
	if builder.Len() != 0 {
		s := treeset.NewWithStringComparator()
		s.Add(builder.String())
		*parts = append(*parts, s)
		builder.Reset()
	}
}

func addPartsToSet(ans *treeset.Set, parts *[]*treeset.Set) {
	processParts(parts, 0, "", ans)
}

func processParts(parts *[]*treeset.Set, i int, path string, ans *treeset.Set) {
	if i == len(*parts) {
		if path != "" {
			ans.Add(path)
		}
	} else {
		part := (*parts)[i]
		it := part.Iterator()
		for it.Next() {
			cur := it.Value().(string)
			processParts(parts, i+1, path+cur, ans)
		}
	}
}

func toSlice(set *treeset.Set) []string {
	slice := make([]string, 0)
	it := set.Iterator()
	for it.Next() {
		slice = append(slice, it.Value().(string))
	}
	return slice
}

func main() {
	expression := "{a,b}{c,{d,e}}"
	result := braceExpansionII(expression)
	fmt.Println(result)
}

在这里插入图片描述

c – 如果我在清楚的情况下使用指针,编译器可以内联虚函数吗?

c – 如果我在清楚的情况下使用指针,编译器可以内联虚函数吗?

我已经读了 Are inline virtual functions really a non-sense?.但我还是有一些疑问,没有发现任何答案.

他们说如果情况不模糊,编译器应该在虚拟函数内联.

然而:

This can happen only when the compiler has an actual object rather than a pointer or reference to an object.

那么如果我有一个派生自A的B类(它包含一个虚拟的void doSth()函数),而我使用B *指针,而不是A *:

B* b = new B;

b->doSth();

>假设B没有任何子类.这是很明显的(在编译时)应该调用什么函数.所以有可能内联.是吗?
>假设B有一些子类,但是这些类没有自己的doSth()函数.所以编译器应该“知道”调用唯一的函数是B :: doSth().我想这不是内联吗?

解决方法

B是否有任何派生类没有关系.在这种情况下,b指向B对象,因此编译器可以内联调用.

任何体面的现代编译器肯定会在你的情况下做到这一点.如果你不使用指针,它会变得容易一些.那不是一个真正的“优化”.通过查看运算符左侧的AST节点,可以省略虚拟呼叫的事实变得很明显.但是,如果使用指针,则需要跟踪被指针的动态类型.但是现代编译器是有能力的.

编辑:一些实验是有序的.

// main1.cpp
struct A {
  virtual void f();
};

struct B : A { 
  virtual void f();
};

void g() {
  A *a = new A;
  a->f();

  a = new B;
  a->f();
}

// clang -O2 -S -emit-llvm -o - main1.cpp | c++filt
// ...
define void @g()() {
  %1 = tail call noalias i8* @operator new(unsigned int)(i32 4)
  %2 = bitcast i8* %1 to %struct.A*
  %3 = bitcast i8* %1 to i32 (...)***
  store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for A,i32 0,i32 2) to i32 (...)**),i32 (...)*** %3,align 4
  tail call void @A::f()(%struct.A* %2)
  %4 = tail call noalias i8* @operator new(unsigned int)(i32 4)
  %5 = bitcast i8* %4 to i32 (...)***
  store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for B,i32 (...)*** %5,align 4
  %tmp = bitcast i8* %4 to %struct.B*
  tail call void @B::f()(%struct.B* %tmp)
  ret void
}
// ...

可以看出,cl ang ang ang……when when when when when……….

java - 在java中使用snakeyaml写入yaml时,我可以只删除大括号吗

java - 在java中使用snakeyaml写入yaml时,我可以只删除大括号吗

如何解决java - 在java中使用snakeyaml写入yaml时,我可以只删除大括号吗?

我正在使用蛇 yaml 转储到 yaml 文件中。 但是大括号也被写入文件。

root:
  nested_object1:
    mapping:
    - [element1,element2]
    - [element1,element2]
    test: {
       obj1: true,obj2: true,obj3: false
    }

我也使用了 FlowStyle.BLOCK,但它也删除了方括号。

最终结果应该是 -

root:
 nested_object1:
    mapping:
    - [element1,element2]
    test:
       obj1: true
       obj2: true
       obj3: false
    

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

JavaScript使用“ new”运算符创建对象时,我们可以省略括号吗?

JavaScript使用“ new”运算符创建对象时,我们可以省略括号吗?

我看到过这样创建的对象:

const obj = new Foo;

但是我认为创建对象时括号不是可选的:

const obj = new Foo();

创建对象的前一种方法在ECMAScript标准中是否有效并定义?前一种创建对象的方式与后一种创建方式之间有什么区别吗?是一个比另一个更好的选择吗?

答案1

小编典典

引用David Flanagan 1:

作为一种特殊情况,new仅对于运算符,JavaScript通过在函数调用中没有参数的情况下允许省略括号来简化语法。以下是使用new运算符的一些示例:

o = new Object;  // Optional parenthesis omitted hered = new Date();...

就个人而言,即使构造函数不带任何参数,我也总是使用括号。

另外,如果省略括号,JSLint可能会伤害您的感觉。报告Missing ''()'' invoking aconstructor,该工具似乎没有办法容忍括号遗漏。

今天关于如果我在Java中省略花括号可以吗?java省略this的介绍到此结束,谢谢您的阅读,有关2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串 定义下面几条语、c – 如果我在清楚的情况下使用指针,编译器可以内联虚函数吗?、java - 在java中使用snakeyaml写入yaml时,我可以只删除大括号吗、JavaScript使用“ new”运算符创建对象时,我们可以省略括号吗?等更多相关知识的信息可以在本站进行查询。

本文标签: