有没有办法编码重要因子交换整数

时间:2010-12-16 04:03:22

标签: java swap

我们在很多地方都有这个代码,如果一个值高于另一个值,我们会交换整数。有没有办法重新考虑这个代码,所以它可以重复使用?

    int numerator2 = <some random number>;
    int denominator2 = <some random number>;

    if (numerator2 > denominator2) {
        int temp = denominator2;
        denominator2 = numerator2;
        numerator2 = temp;
    }

7 个答案:

答案 0 :(得分:4)

你的问题归结为你需要一种整洁且可重复使用的方式来交换交换一对裸变量的值。 (我知道你想有条件地做这件事,但对于无条件的情况更容易解释。)

不幸的是,在Java中无法做到这一点。可以使用假设执行此操作的各种编程语言机制在Java中不可用。以下是摘要:

  • 在某些语言中,您可以使用引用调用(例如FORTRAN)或INOUT参数传递(例如ObjectiveC)来执行此操作:

    int a = 1;
    int b = 2;
    swap(a, b);
    
  • 在某些语言中,您可以通过传递地址(例如C和C ++)来模拟通过引用进行调用:

    int a = 1;
    int b = 2;
    swap(&a, &b);
    
  • 在某些语言中,有一个元组赋值语句(例如Perl):

    int a = 1;
    int b = 2;
    a, b = {b, a};
    // or ...
    a, b = swap(b, a); // where swap returns an explicit or implicit tuple.
    
  • 在某些语言中,过程/方法可以返回多个结果,并且有一种特殊的语法可以将单个结果分配给不同的变量(例如,Mesa ......我确信有不那么模糊的例子):< / p>

    int a = 1;
    int b = 2;
    a, b = swap(b, a);
    

不幸的是,Java中没有这些机制可用。你能做的最好的就是使用某种可变的包装类而不是简单的原始类型; e.g。

   IntHolder a = new IntHolder(1);
   IntHolder b = new IntHolder(2);
   swap(a, b);

<强>后续

可以使用现有类型(如AtomicType或Apache Commons'MutableInteger)作为包装类。我推荐后者,因为它稍快一点。此外,使用AtomicType实例并不意味着您可以原子方式实现swap方法。

答案 1 :(得分:3)

创建一个包含两个数字作为成员变量的类。它可以在构造函数中接受这些。

然后在该类上创建一个方法,该方法返回同一个类的新实例,如果需要,则交换成员。

答案 2 :(得分:2)

原始类型不是最快的方式吗?在堆栈上创建基元以及为什么会生成对象?

答案 3 :(得分:2)

@ Emil答案的简短版本是

public static void swap(AtomicInteger i,AtomicInteger j) {
    j.set(i.getAndSet(j.get()));
}

但是,在处理大量数据时,通常会使用集合或对象。在这些情况下,您不需要额外的对象来交换值。

答案 4 :(得分:1)

您可以使用AtomicInteger,也可以自己编写MutableInteger而不是使用原始int

<强>代码:

void swap(AtomicInteger i,AtomicInteger j){
        int tmp=i.get();
        i.set(j.get());
        j.set(tmp);
    }

答案 5 :(得分:1)

您可以使用AtomicInteger或任何用户创建的包含int值的自定义包装器对象。然后你可以写一个swap方法。

答案 6 :(得分:0)

我建议坚持使用原始版本。

原因:

  • 通过避免包装来提高性能
  • 这是一种常见的习惯用语,您可以轻松地在心理上解析交换代码
  • 保存30个字符左右的输入并不能证明IMHO添加了额外的抽象层。如果您包含转换为包装类型,则可能根本没有保存任何输入。
  • 如果您担心垂直空间,可以轻松地将交换写入一行

e.g。

if (numerator2 > denominator2) {
    int t = denominator2; denominator2 = numerator2; numerator2 = t;
}

如果您喜欢有趣的黑客攻击,这里也可以通过利用操作顺序在单个表达式中执行此操作:

numerator2= denominator2+ (0&(denominator2=numerator2));

当然,如果您关心可读性/维护,则不建议这样做: - )