我是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中使这个东西工作。
答案 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")