C# 从C转换后java代码中的错误#
下面是一个函数,用于在数组中打印重复的int。 在c#中: 有人能给我解释一下这行代码是做什么的,以及我如何正确地用java编写它吗?C# 从C转换后java代码中的错误#,c#,java,C#,Java,下面是一个函数,用于在数组中打印重复的int。 在c#中: 有人能给我解释一下这行代码是做什么的,以及我如何正确地用java编写它吗? 谢谢您将TryGetValue的代码复杂化了——这个简单的翻译应该可以: if ( hash.containsKey(a[i]) ) { if (!hash.get(a[i])) { hash.put(a[i], true); } } else { hash.put(a[i], false); } C#有一种获取值的方法
谢谢您将
TryGetValue的代码复杂化了
——这个简单的翻译应该可以:
if ( hash.containsKey(a[i]) ) {
if (!hash.get(a[i])) {
hash.put(a[i], true);
}
} else {
hash.put(a[i], false);
}
C#有一种获取值的方法和一个标志,告诉您是否在单个调用中找到了值;Java没有类似的API,因为它缺乏通过引用传递变量的能力。不要直接转换C#实现。仅当id存在时才分配repeatSeen
值
if (hash.containsKey(a[i]))
{
repeatSeen = hash.get(a[i]).equals(repeatSeen)
if (!repeatSeen)
{
hash.put(a[i], true);
repeats++;
}
}
要回答所问的实际问题,请执行以下操作:
if (hash.containsKey(a[i]) ? (repeatSeen = hash.get(a[i])) == repeatSeen : false)
这在句法上确实是错误的。我没有看过代码的其余部分,但在我的时代编写了解析器/代码生成器,我猜应该是这样的
if (hash.containsKey(a[i]) ? (repeatSeen = hash.get(a[i])) == repeatSeen) : false)
这是无缘无故的丑陋——通常发生在代码生成器上,尤其是那些没有优化过程的代码生成器——但它在语法上是正确的。让我们看看它是否真的有明确的含义
警告:我没有通过运行它来交叉检查——如果有人发现错误,请告诉我强>
第一,代码> x y:z:/>代码确实是三元运算符,java通过C++继承。这是一个if-then-else表达式——if
x
为true
它的值为y
,而ifx
为false
它的值为z
。因此,这一行的含义与:
boolean implied;
if (hash.containsKey(a[i]) then
implied = (repeatSeen = hash.get(a[i])) == repeatSeen);
else
implied = false;
if(implied)
。。。等等
现在,剩下的一点丑陋是这一点和表达的后半部分。我不知道您是否熟悉使用=(赋值)作为表达式运算符;它作为运算符的值与分配给变量的值相同。这主要是为了让你做一些事情,比如a=b=0代码>,但它也可以用于在表达式的中间设置变量“通过”。铁杆C黑客用它做了一些非常聪明和丑陋的事情(他说,就是其中之一)。。。这是用来从哈希表中获取值,分配给repeatSeen,然后——通过=
——对repeatSeen测试相同的值
现在的问题是,=
的两个参数的计算顺序是什么?如果首先计算左侧,则=
必须始终为true
,因为赋值将在右侧检索值之前发生。如果首先计算右侧,我们将以非常不明显的方式将新值与以前的值进行比较
事实上,还有一个StackOverflow条目解决了这个问题:
据此,Java的规则是,运算符的左参数总是在右参数之前求值。因此第一种情况适用,=
总是返回true
为了反映这一点,再次改写我们的翻译,它变成了
boolean implied;
if (hash.containsKey(a[i]) then
{
repeatSeen = hash.get(a[i]));
implied = true;
}
else
implied = false;
if(implied)
可以进一步改写为
if (hash.containsKey(a[i]) then
{
repeatSeen = hash.get(a[i]));
// and go on to do whatever else was in the body of the original if statement
“如果这就是他们的意思,为什么他们不这样写呢?”。。。正如我所说,我已经编写了代码生成器,在许多情况下,最简单的方法就是确保您正在编写的所有片段都是针对它们试图做的事情的,而不必担心它们是否与人类编写的代码相似。特别是,它很容易根据模板生成代码,模板允许您实际不使用的情况,而不是试图识别简单的情况并以不同的方式生成代码
我猜编译器在意识到它需要计算位时,正在引入和转换计算位,这在它启动if
时创建了奇怪的嵌套,然后意识到它需要一个条件赋值来重复,无论出于何种原因,我们都试图在if
的测试中实现这一点,而不是在它的主体中。相信我,我见过代码生成器中更糟糕的克鲁金 这就是你的三元运算符,巴德。你缺少代码>for循环中的分号for(int i=0;i
“repeatSeen自身的自我比较”-findRepeat.javaFindBugs问题(最可怕)将C#转换为java
-无法将C#(2.0以上)转换为java。java是一种停留在90年代的蹩脚语言,而C#则在不断发展。尝试将包含LINQ、委托、属性、事件、类型推断、using语句和async/await
的C#5代码转换为java。如果需要支持非Windows平台,请使用Xamarin。这比你为所有在ballsthanks患上基于java的癌症的C#开发者支付的医疗费用要便宜得多。现在,它已经开始起作用了。我仍然需要在循环中添加repeats++,因为在创建hashmap之后,我需要迭代hashmap以打印出重复的int。非常感谢。
boolean implied;
if (hash.containsKey(a[i]) then
implied = (repeatSeen = hash.get(a[i])) == repeatSeen);
else
implied = false;
if(implied)
boolean implied;
if (hash.containsKey(a[i]) then
{
repeatSeen = hash.get(a[i]));
implied = true;
}
else
implied = false;
if(implied)
if (hash.containsKey(a[i]) then
{
repeatSeen = hash.get(a[i]));
// and go on to do whatever else was in the body of the original if statement