首页 > 解决方案 > Java中的元组赋值

问题描述

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

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

  1. 尽可能通用。
  2. 尽可能可读。
  3. 在赋值位置不包含临时变量。
  4. 实用方法是允许的,但仅限于静态方法。不应创建或导入元组类。不应使用数组或集合。

我举一个简单的例子。不要太在意*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

如何得到符合上述四个要求的先前结果?如果您看到一个不错的部分解决方案,请将其添加为答案。

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

标签: javatuplesvariable-assignmentmultiple-assignment

解决方案


我不会。他们是一个可怕的想法。只需让自己成为与想要返回值的方法相同的类中的第二个小类。

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);
}

关键是,当您想与一组可能相关的变量进行交互时,如果您将它们放入一个类中,您可能最终会将它们留在那里并使用附加功能扩展该类。

如果你有拐杖,你可能不会创建你需要的新课程,并且可能会尝试在一个课程中做所有事情


推荐阅读