在Java中的一个方法中返回两个数组
考虑到我有两个阵列,例如:在Java中的一个方法中返回两个数组,java,arrays,object,linked-list,Java,Arrays,Object,Linked List,考虑到我有两个阵列,例如: String[] array1 = new String[10]; int[] array2= new int[10]; 因此,在一个方法中,我计算了两个数组,即array1和array2 现在我想返回这两个数组。我该怎么做呢 我在这里读到,我可以创建另一个类,定义某些对象类型,并在该类构造函数中封装这些数组,但我仍然感到困惑,并没有完全理解 如果您能给我一个这样做的工作示例,或者可能是任何类似的想法,这将是很好的。为了简化示例,请使用公共字段。与方法的返回类型为i
String[] array1 = new String[10];
int[] array2= new int[10];
因此,在一个方法中,我计算了两个数组,即array1
和array2
现在我想返回这两个数组。我该怎么做呢 我在这里读到,我可以创建另一个类,定义某些对象类型,并在该类构造函数中封装这些数组,但我仍然感到困惑,并没有完全理解
如果您能给我一个这样做的工作示例,或者可能是任何类似的想法,这将是很好的。为了简化示例,请使用公共字段。与方法的返回类型为
int
的方式相同,您可以定义方法以返回已定义的类类型
class MyPair{
public String[] StringArr;
public int[] IntArr;
}
class MyClass{
public MyPair Foo(){
MyPair pair = new MyPair();
pair.StringArr = new String[10];
pair.IntArr = new int[10];
return pair;
}
}
实际上,您也可以返回如下内容:
return new Object[]{array1, array2};
假设在调用此方法的外部,返回的对象是obj
。然后以obj[0]
的身份访问阵列1,以obj[1]
的身份访问阵列2(需要正确的铸造)。这是怎么回事
public Object[] ReturnArray()
{
String[] array1 = new String[10];
int[] array2= new int[10];
Object[] arrayObjects = new object[2];
arrayObjects [0] = array1;
arrayObjects [1] = array2;
return arrayObjects;
}
您可以稍后通过以下方式访问它们:
Object[] arrayObjects = ReturnArray();
String[] array1 = (String[])arrayObjects[0];
int[] array2= (int[])arrayObjects[1]
如果这两个是相关的,那么您最好返回一个
java.util.Map
,其中一个作为键,另一个作为值,或者返回一个java.util.List
,其中包含您自己创建的对象,这些对象将字符串和int
封装在一起
我一直主张使用可信库而不是滚动自己的库(即使它只是一个元组)
有人可能会问,为什么要返回两个值,它们之间的关系如何。通常在这种情况下,值是相关的,应该封装在一个对象中。您可以如下定义Pair类:
public class Pair
{
private String[] array1;
private int[] array2;
public Pair(String[] array1, int[] array2)
{
this.array1 = array1;
this.array2 = array2;
}
public String[] getArray1() { return array1; }
public int[] getArray2() { return array2; }
}
Pair pair = someMethod();
String[] arrayA = pair.getArray1();
int[] arrayB = pair.getArray2();
然后您可以在您的方法中使用它:
public Pair someMethod()
{
String[] array1 = new String[10];
int[] array2 = new int[10];
// blah blah blah
return new Pair(array1, array2);
}
您可以使用以下方法:
public class Pair
{
private String[] array1;
private int[] array2;
public Pair(String[] array1, int[] array2)
{
this.array1 = array1;
this.array2 = array2;
}
public String[] getArray1() { return array1; }
public int[] getArray2() { return array2; }
}
Pair pair = someMethod();
String[] arrayA = pair.getArray1();
int[] arrayB = pair.getArray2();
定义一个对您试图返回的内容有意义的对象。例如:
public class Inventory {
private int[] itemNumbers; //array2
private String[] itemNames; //array1
public Inventory(int[] itemNumbers, String[] itemNames)
{
this.itemNumbers = itemNumbers;
this.itemNames = itemNames;
}
//Setters + getters. Etc.
}
然后在其他地方:
return new Inventory(array2, array1);
===============================================
注:
上面的例子不是一个很好的库存例子。创建一个描述项(项id、项名称等)的项类,并存储这些项的数组
如果您的两个阵列不相关,那么上面的方法更便宜。理想情况下,您应该将数组的计算和返回拆分为它们自己的方法
如果int/String数组表示键/值对,那么use可以使用Map-DST实现(http://download.oracle.com/javase/6/docs/api/java/util/Map.html)取而代之的是把它还给我。您可以根据需要迭代键/值 根据您的评论,您可以通过多种方式来实现这一点
创建一个代表用户的类
您提到您正在使用一个二维整数数组,其中每一行描述一个用户。也许有一个对象来描述每个用户是合理的
class User {
String name;
int[] values;
// setters and getters for name, values
}
User[] doSomething() {
User[] users = new User[10];
// fill the array
return users;
}
创建一个表示整个返回值的类
如果您确实需要2D阵列的额外性能,这是很好的
class UserData {
String[] names;
int[][] values;
// setters and getters for names, values
}
UserData doSomething() {
UserData userData = new UserData();
// set names and values
return userData;
}
使用新对象[]{array1,array2}重新运行
retun new Object[]{array1,array2};
在调用方方法中,您将得到返回的对象“obj”,然后得到
可以使用Map
。使用Map
的优点是,可以返回任意多的值。这个想法在代码中的实现类似于——
public Map returnMultipleValues(){
Map<String, Object> multiValues = new HashMap<String, Object>();
String[] array1 = new String[10];
int[] array2 = new int[10];
//populate and manipulate these two array
multiValues.put("array1", array1);
multiValues.put("array2", array2);
return multiValue;
}
您可能在这里寻找不同的数据结构。两个数组中的值之间的关系是什么?其中一个中的值是否与另一个中的值相对应?一个是某种“缓存”还是可重用的“工作区”?通常,一个方法实际上只需要返回一件事,因此了解为什么一个方法试图同时返回两件事是很有用的。实际上,一个是int类型的二维数组,而它的[i]索引将具有字符串用户名,这些用户名将位于String[]数组中。此1D字符串数组的索引将与2D int数组的索引相同。所以以后我可以根据需要引用这个1D数组中的字符串用户名。谢谢,这是我最初的想法。谢谢,使用Map似乎是个不错的主意,但因为我不想陷入关键值的麻烦,所以我会坚持用更天真的方式来做这项工作。什么是“关键值的麻烦”?更天真的可能就没那么好了。你能在这些原始值的基础上进行更好的抽象,你和这个方法的客户就会变得更好。我觉得不舒服,但你是对的。如果你正在进行关联数据访问,你可能应该按照@duffymo的建议使用地图。它将为您节省大量的麻烦和代码。只是一个问题,那么我的方法的返回类型应该是什么?那么我如何使用obj,我无法访问像obj[0][0]这样的数组值,这个答案是无用的。谢谢@Mr,您的想法与@anubhava的想法相同,我已经在使用它了。