有两个不确定参数的方法?

时间:2014-06-23 13:17:52

标签: java methods variadic-functions

我现在明白如何根据Java method with unlimited arguments

创建无限参数

但我想知道将此扩展为两个参数的语法是什么,类似于printf

我想创建无限的String,int对。

目标是显示String1:Int1,String2:Int2,依此类推。我只是不确定语法是什么,更不用说它是否可能。

4 个答案:

答案 0 :(得分:2)

嗯,首先,你不能这样做:

public void foo(String... strings, int... ints) {

由于您收到的错误是varargs参数strings需要 last

所以你可能想要创建一个小包装类,比如StringWithInt,然后这样做:

public void foo(StringWithInt... values) {

我希望这有帮助!

答案 1 :(得分:2)

这不是直接可能的,但这里有一些方法:

  1. 如果字符串是唯一的,您可以将数据作为Map传递:

    public void method(Map<String,Integer> pairs) {
        ...
    }
    
  2. 您可以使用两个单独的数组:

    public void method(String[] strings, int[] ints) {
        if (strings.length != ints.length) throw new IllegalArgumentException();
        ...
    }
    

    请致电:

    method(new String[] { "a", "b", "c" }, new int[] { 1, 2, 3 });
    
  3. Object用于所有内容并稍后进行排序。这遭受丑陋的内部和缺乏编译时类型检查,但它具有最短的调用语法:

    public void method(Object... args) {
        if (args.length % 2 != 0) throw new IllegalArgumentException();
        for (int i = 0; i < args.length; i += 2) {
            String s = (String)args[i + 0];
            int i = (Integer)args[i + 1];
    
            ...
        }
    }
    
  4. 使用构建器样式对象:

    public Pairs method() {
        return new Pairs();
    }
    
    // make the names here meaningful for what your method actually does
    public static class Pairs {
        private static class Pair {
            String s;
            int i;
        }
    
        private final List<Pair> pairs = new ArrayList<>();
    
        private Pairs() {}
    
        public Pairs add(String s, int i) {
            Pair p = new Pair();
            p.s = s;
            p.i = i;
            pairs.add(p);
            return this;
        }
    
        public void run() {
            for (Pair p : pairs) {
                ... do method's work here ...
            }
        }
    }
    

    根据您想要实现的目标,这可能会使其过于复杂,但它为调用者提供了一种非常令人愉快且完全类型检查的语法:

    method()
        .add("a", 1)
        .add("b", 2)
        .add("c", 3)
        .run();
    

答案 2 :(得分:1)

使参数成为一个Object参数,它有自己的问题......

public void foo(Object... things)

但最好的想法是为每种参数类型使用通用列表:

public void foo(List<String> strings, List<Integer> integers) {}

如果该方法特别需要匹配对,则也可以使用Map<String, Integer>

(不,你不能原创问题)

答案 3 :(得分:0)

嗯,为什么你不直接映射?

像这样的东西

public void foo(Map<String,Integer> map){


}

或者可能代替String和int,只使用对象?

 public void foo(Object... args){

 }