交换数字到位

时间:2016-01-13 15:46:10

标签: java

我是Java新手,因此这个问题。 我试图在不使用第三个临时变量的情况下交换两个数字。代码很简单。

public static void swapInPlace(int a, int b){
        a = a + b;
        b = a - b;
        a = a - b;
    }

    public static void main(String[] args) {
    // write your code here
        int a = 12;
        int b = 7;
        swapInPlace(a, b);
        System.out.println("a: " + a + " b: " + b);

    }

逻辑在调试器中运行良好,但为a和b输出相同的值。我理解同样的情况正在发生,因为swapInPlace函数使用了复制的值。

现在,如果我必须在C ++中使用此功能,我只需将方法签名更改为

public static void swapInPlace(int& a, int& b)

但是由于这不能在java中完成,我的问题是如何在java中使这个东西工作。

5 个答案:

答案 0 :(得分:3)

Java 总是按值传递。但是,在某些情况下,您传递的是引用,因此可以更改对象的内容。

您可以使用 AtomicInteger 作为 int 的可变包装器。

import java.util.concurrent.atomic.AtomicInteger;

public class SwapInPlaceMain {
    public static void swapInPlace(AtomicInteger a, AtomicInteger b) {
        a.set(a.get() + b.get());
        b.set(a.get() - b.get());
        a.set(a.get() - b.get());
    }

    public static void main(String[] args) {
        // write your code here
        AtomicInteger a = new AtomicInteger(12);
        AtomicInteger b = new AtomicInteger(7);
        swapInPlace(a, b);
        System.out.println("a: " + a + " b: " + b);
    }
}

答案 1 :(得分:1)

正如其他答案所说,你需要使用包装器。这是一个关于如何做的简短示例。

private class IntWrap{
    int value;

    public IntWrap(int v){ this.value=v; }
}

public static void swapInPlace(IntWrap a, IntWrap b){
    a.value = a.value + b.value;
    b.value = a.value - b.value;
    a.value = a.value - b.value;
}

public static void main(String[] args) {
    IntWrap a = new IntWrap(12);
    IntWrap b = new IntWrap(7);
    swapInPlace(a, b);
    System.out.println("a: " + a.value + " b: " + b.value);

}

答案 2 :(得分:1)

你有2个选项,创建一个内部类并创建它的一个对象,这个类可以有两个变量并返回swapInPlace()方法中的对象。

另一个可能是传递一个数组,例如:

class Swap {
    public static void swapInPlace(int array[]){
        array[0] = array[0] + array[1];
        array[1] = array[0] - array[1];
        array[0] = array[0] - array[1];
    }

    public static void main(String[] args) {
    // write your code here
        int array[] = new int []{12, 7};
        swapInPlace(array);
        System.out.println("a: " + array[0] + " b: " + array[1]);

    }
}

以上程序的输出是:

a: 7 b: 12

答案 3 :(得分:1)

实现这一目标的一种(可能是有争议的)方法就是使用宏预处理器。

默认情况下,Java可能不包含对宏的支持,但没有什么可以阻止您使用预处理器。我不时自己使用C预处理器和Java。

值得注意的是,当有人提出这个问题时,Java人们往往会在嘴里发泡。这种情况没有合理的理由,但IMO长期担心,因为预处理器是完全合法的编程工具。 Java编译器对预处理器不友好,但是有很多方法(我为此目的编写了一个编译器修改,但不需要使用预处理器,这对我来说很方便)。

那里有很多预处理器。值得注意的选择是C预处理器和generic preprocessor ( GPP )。令人尊敬的M4系统也让人想到了。

答案 4 :(得分:1)

我认为您忘记通过“引用”将值发送给函数。您传递的是值而不是它们的引用地址,因此即使在调用函数后,值也不会改变。

此代码将对您的问题进行排序

library(shiny)

histogramUI <- function(id) {
  tagList(
    fluidRow(column( 4, selectInput(NS(id, "var"), "Variable", choices = names(mtcars)),
    numericInput(NS(id, "bins"), "bins", value = 10, min = 1)),
    column(8, plotOutput(NS(id, "hist"))))
  )
}


histogramServer <- function(id) {
  moduleServer(id, function(input, output, session) {
    data <- reactive(mtcars[[input$var]])
    output$hist <- renderPlot({
      hist(data(), breaks = input$bins, main = input$var)
    }, res = 96)
  })
}

ui <- function(request){
  fluidPage(
    bookmarkButton(),
    actionButton("add", "Add"),
    div(id = "add_here")
    )
  }

server <- function(input, output, session) {
  
  
  observeEvent(input$add, {
    histogramServer(paste0("hist_", input$add))
    insertUI(selector = "#add_here", ui = histogramUI(paste0("hist_", input$add)))
  })
  
  
}

shinyApp(ui, server, enableBookmarking = "server")