我现在明白如何根据Java method with unlimited arguments
创建无限参数但我想知道将此扩展为两个参数的语法是什么,类似于printf
?
我想创建无限的String,int对。
目标是显示String1:Int1,String2:Int2,依此类推。我只是不确定语法是什么,更不用说它是否可能。
答案 0 :(得分:2)
嗯,首先,你不能这样做:
public void foo(String... strings, int... ints) {
由于您收到的错误是varargs参数strings
需要 last 。
所以你可能想要创建一个小包装类,比如StringWithInt
,然后这样做:
public void foo(StringWithInt... values) {
我希望这有帮助!
答案 1 :(得分:2)
这不是直接可能的,但这里有一些方法:
如果字符串是唯一的,您可以将数据作为Map传递:
public void method(Map<String,Integer> pairs) {
...
}
您可以使用两个单独的数组:
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 });
将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];
...
}
}
使用构建器样式对象:
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){
}