Java中的元组赋值

Java中的元组赋值,java,tuples,variable-assignment,multiple-assignment,Java,Tuples,Variable Assignment,Multiple Assignment,与Python不同,Java本机不支持元组。因此,is没有提供像这样有用的可能性 您将如何实施它?您的解决方案应: 尽可能做到普遍 尽可能地可读 在赋值位置不包含临时变量 允许使用实用方法,但只能使用静态方法。不应创建或导入任何元组类。不应使用数组或集合 我将给出一个简单的例子。不要太注意*Func()方法的内容。它们可以是内联的,或者依赖较少的变量,或者额外依赖其他变量 public class TupleAssignment { static String sFunc(String

与Python不同,Java本机不支持元组。因此,is没有提供像这样有用的可能性

您将如何实施它?您的解决方案应:

  • 尽可能做到普遍
  • 尽可能地可读
  • 在赋值位置不包含临时变量
  • 允许使用实用方法,但只能使用静态方法。不应创建或导入任何元组类。不应使用数组或集合
  • 我将给出一个简单的例子。不要太注意
    *Func()
    方法的内容。它们可以是内联的,或者依赖较少的变量,或者额外依赖其他变量

    public class TupleAssignment {
        static String sFunc(String s, int i, double d) {
            return i + s + d;
        }
    
        static int iFunc(String s, int i, double d) {
            return i + s.length() - (int) d;
        }
    
        static double dFunc(String s, int i, double d) {
            return (double) i / s.length() + d;
        }
    
        public static void main(String[] args) {
            String s = "ABCDE";
            int i = 2;
            double d = 0.6;
    
            String s1 = sFunc(s, i, d);
            int i1 = iFunc(s, i, d);
            double d1 = dFunc(s, i, d);
            s = s1;
            i = i1;
            d = d1;
    
            System.out.println(s + ", " + i + ", " + d);
        }
    }
    
    这将产生正确的结果:

    2ABCDE0.6, 7, 1.0
    
    但需要附加变量
    s1
    i1
    d1
    。如果您试图以这种方式摆脱它们:

    s = sFunc(s, i, d);
    i = iFunc(s, i, d);
    d = dFunc(s, i, d);
    
    您将得到错误的结果:

    2ABCDE0.6, 11, 1.8222222222222224
    
    如何获得符合上述四个要求的先前结果?如果你看到一个很好的部分解决方案,也把它作为一个答案


    请注意,这个问题与生成元组无关。您不需要实现元组返回值。你甚至不需要知道什么是元组。它是关于多重赋值的。(如果你愿意,可以称之为同时赋值或向量赋值)。

    我不会。这是个糟糕的主意。只需在与要返回值的方法相同的类中创建一个小小的第二个类

    public Class ReturnValue{public int age; public String name;}
    
    或者如果你是偏执狂

    public Class ReturnValue{
        public final int age; 
        public final String name;
        public ReturnValue(int pAge, String pName){age=pAGe;name=pName;}
    }
    
    但如果它真的只是替换一个元组,那就有点冗长了

    一旦创建了这个小类,您可能会发现它很有用,并最终向它添加了方法,使公共变量成为私有的(或者最终使用一个好的构造函数)并将其移动到它自己的文件中--在您知道它之前,它是一个完整的工作类,您一直缺少它,如果java提供元组,您甚至不知道您缺少它

    通常情况下,我会对可变公共变量产生问题,但如果该类只是用作元组,那么就可以了,值将立即被提取出来。如果不是这样,那么您已经认识到该类的实用性,应该将其重构为一个真正的类

    在您的示例中,您肯定缺少一个类。我建议:

    class Func(String s, int i, double d) {
        final String s;
        final int i;
        final double d;
    
        public String sFunc() {
            return i + s + d;
        }
        public int iFunc() {
            return i + s.length() - (int) d;
        }
    
        public double dFunc() {
            return (double) i / s.length() + d;
        }
    }
    
    public class TupleAssignment {
        public static void main(String[] args) {
        private func=new Func("ABCDE", 2, 0.6);
    
        String s = sFunc();
        int i = iFunc();
        double d = dFunc();
    
        System.out.println(s + ", " + i + ", " + d);
    }
    
    关键是,当您想要与一组变量交互时,它们很可能是相关的,如果您将它们放入一个类中,您可能最终会将它们留在该类中,并使用其他功能扩展该类


    如果您有一个拐杖,您可能无法创建所需的新类,并且可能尝试在一个类中完成所有工作

    我可能会通过将
    javatuples
    库导入到我的项目中来实现它@这与为自己创建它们没有区别。编辑这个问题来澄清这一点。我想我会争辩说,不必创建它会在时间成本上产生巨大的差异。我认为你自己动手的唯一原因是作为一个学术练习。@TheHeadRush好的,让我们假设你找到了一个很好的元组类,就像你所指的那个,并且正在使用它。写几行代码来比较Python元组分配和使用该元组类的Java变体。您将看到,您至少需要使用一些
    getValue*()
    方法从这个类中提取字段,并将它们分配给您的变量——这比并排使用两个列表可读性差。这就是为什么我优先考虑可读性。根据措辞,听起来像是你复制并粘贴了一份学校作业,并希望我们为你做(因此我投了反对票)。你能澄清一下吗?它可以很容易地实现为一个不可变的类。只要让set方法返回一个新对象,而不是更改被调用的对象。我的主要目标是类的大小,一行代码没有方法。我想不出如何使它不可变。我以前用构造函数和公共final变量做过这件事,这确实使它变得安全,但它添加了很多无意义的代码,这些代码是您将立即扔掉的。(正如我所说,如果你不扔掉它,你可能想给它添加方法,并使它成为一个完整的类)你建议将
    ReturnValue
    类插入问题代码的哪个位置
    sFunc
    iFunc
    dFunc
    只是示例。考虑它们的内联(即<代码> S1= I+S+D;等)@ J.McCaleAn更新答案。如果它们是内联的,可以将它们提取到方法中。另外,我在Groovy中使用元组赋值是为了好玩,但它往往可读性较差,并导致您无法创建小而有用的类来生成实际代码。如果您所要做的只是交换两个变量(如我在问题开始时给出的Python链接所示),该怎么办?为此创建一个类是一个好主意吗?