Jump to content
新域网络技术论坛
Sign in to follow this  
Jamers

一个看似简单实则复杂的程序问题

Recommended Posts

这个问题原来是C++的版本,目前在学习Java中,问题就用Java描述吧。

看代码:将变量a 和 b的值交换后输出。当然实际情况下,肯定不允许这样的情况发生,如果可以传指参的话,直接使用指参就可以了,比如PHP里可以直接使用  function doSwap(&$a, &$b) {...} 就可以了,我查了一下JAVA是没有指参的,所以不能这么处理。代码中还有部分不是太理解,逻辑是理解了,等后续再看吧。

public class Main {

    public static void main(String[] args)
    {
        Integer a, b;
        a = 1;
        b = 2;
        System.out.printf("a = %d, b = %d\n", a, b);
        try {
            doSwap(a, b);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        System.out.printf("a = %d, b = %d\n", a, b);
    }

    private static void doSwap(Integer a, Integer b) throws Exception
    {
        // 请在这里实现交换过程
    }
}

 

我这里先给出一个PHP版本的解法,不使用Class的情况是可以实现的,如果限制在Class环境中,暂时还没想到实现方式,PHP中没有内存操作的概。:

$a = 10;
$b = 20;

echo "a:{$a} b:{$b}\n";
doSwap($a, $b);
echo "a:{$a} b:{$b}\n";

function doSwap($a, $b)
{
    /*
        请实现交换两个变量
        预期结果:
        a:1 b:2
        a:2 b:1
    */
    global $a, $b;
    $c = $a;
    $a = $b;
    $b = $c;
}

 

看一下JAVA的实现方式,你没看错,就这个操作需要这么长的代码:

import java.lang.reflect.Field;

public class Main {

    public static void main(String[] args)
    {
        Integer a, b;
        a = 1;
        b = 2;
        System.out.printf("a = %d, b = %d\n", a, b);
        try {
            doSwap(a, b);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        System.out.printf("a = %d, b = %d\n", a, b);
    }

    private static void doSwap(Integer a, Integer b) throws java.lang.Exception
    {
        // 请在这里实现交换过程
        int c = a;
        Integer cInteger = new Integer(c);

        Class<? extends Integer> aClass = a.getClass();
        Field avalue = aClass.getDeclaredField("value");
        avalue.setAccessible(true);
        avalue.set(a, b);

        Class<? extends Integer> bClass = b.getClass();
        Field bvalue = bClass.getDeclaredField("value");
        bvalue.setAccessible(true);
        bvalue.set(b, cInteger);
    }
}

 

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×
×
  • Create New...