Возвращение двух массивов из метода - PullRequest
1 голос
/ 21 февраля 2011

Я хочу вернуть два строковых массива из метода (который заполняет эти массивы).Оба массива имеют разный размер друг от друга.Как мне поступить ??

String[] namesOfColumnsFound = new String[45];

String[] namesOfColumnsNotFound = new String[25];

Редактировать: мне просто нужно передать данные .. без поведения не требуется передавать

Ответы [ 9 ]

6 голосов
/ 21 февраля 2011

Создайте объект, который содержит оба массива, а не некоторую композицию коллекции.Почему?

  1. это значительно упростит рефакторинг, если вы измените состав возврата.Вам не придется изменять экземпляры List<Array<...>>
  2. , вы можете инкапсулировать поведение в этого объекта.Ваши клиенты могут запросить этот возвращаемый объект для первого массива, второго массива и т. Д. Более того, они могут попросить возвращаемый объект сделать что-то , используя эти массивы, а не вытащить их.В этом и заключается суть ОО - говорить объектам, что они делают что-то для вас, а не просить их рассказать вам, из чего они сделаны .

например,

public class ReturnType {
   private Array<String> first = ...
   private Array<String> second = ...

   public boolean isValid() { ... }
   public void doSomethingCleverWithReturnValues() { ... }
}

public ReturnType giveMeTwoArrays() {
   ...
   return new ReturnType(...)
}

Это действительно заманчиво сделать что-то простое (например, вернуть кортеж или композицию коллекции), но боль от рефакторинга значительна по сравнению с вышеописанным (я говорю по опыту, только что сделавшему этоошибка снова только сейчас! И это было использование Scala - вывод типа делает жизнь проще, и это все еще боль)

3 голосов
/ 21 февраля 2011

Или создайте простую оболочку, которая будет содержать оба массива.

Пример:

class ArrayHelper{
    private String[] strArr1;
    private String[] strArr2; 
    ... [constructor that sets both arrays and getters to access them]
};
2 голосов
/ 21 февраля 2011

Это еще один способ сделать

return  (new Object[] { obj1 ,obj2 });

return  Arrays.asList(obj1,obj2);

return (новый объект [] {obj1, obj2});

Размер возврата

class xx
{
public static void main (String[] args)
{   
...
Object[] receiver = m();
System.out.println(receiver.length);  //  size is 2
}
public static Object[] m()
{
String m ="suresh";
return  (new Object[] { m ,new ArrayList().add("PEPE") });
}
2 голосов
/ 21 февраля 2011

Вы можете вернуть список из двух элементов.list [0] будет вашим первым строковым массивом, list [1] будет вторым.

1 голос
/ 21 февраля 2011

Вот мои два цента: я избегаю возврата языковых объектов (таких как String, int, String [], arraylist, map и т. Д.) Из методов.Я считаю, что то, что я пишу, должно быть в бизнес-терминологии для удобства чтения и, что более важно, для связи кода с проблемой.

Вот как я бы написал (тестовый код):

            ColumnAnalyzer ca = new ColumnAnalyzer();

        ca.analyze();

        System.out.println(ca.getNamesOfColumnsFound().length) ;

        System.out.println(ca.getNamesOfColumnsNotFound().length) ;

Имя ColumnAnalyzer и метод analyze(), конечно, должны быть изменены, чтобы отражать терминологию бизнес-системы.

1 голос
/ 21 февраля 2011

Вы можете вернуть массив из двух массивов (даже если они имеют разную длину).Список массивов также будет работать.«Самое чистое» решение - использовать какой-то тип Tuple (там был www.javatuples.org, но сервер, похоже, сейчас не работает)

[Редактировать]

Существует несколько способов создать массив массивов, например

public int[][] method() {
   int[] array1 = new int[]{1,2,3,4};
   int[] array2 = new int[]{10,20,30};
   int[][] result = new int[]{array1, array2};
   return result;
}
0 голосов
/ 21 февраля 2011

Вы также можете использовать более «универсальный» объект-оболочку:

public class Tuple<A, B>{
    private A a;
    private B b;

    public Tuple(A a, B b) {
        this.a = a;
        this.b = b;
    }
    public A getFirst(){return a;}
    public B getSecond(){return b;}
}
0 голосов
/ 21 февраля 2011

Хотя это не совсем решает вашу проблему с использованием двух массивов, вот как я бы справился с этим

public Map<String,Boolean> analyzeColumns(SomeStructure struct) {
    Map<String,Boolean> columnName2found = new HashMap<String,Boolean>();
    for(PotentialColumn pc : struct) {
        String name = pc.getName();
        boolean found = pc.isFound();
        columnName2found.put(name,found);
    }
    return columnName2Found;
}


// in action
Map<String,Boolean> columnName2found = anaylzeColumns(struct);

for(Map.Entry<String,Boolean> entry : columnName2found.entrySet()) {
    if(entry.getValue()) handleFound(entry.getKey());
    else handleNotFound(entry.getKey());
}
0 голосов
/ 21 февраля 2011

Вы также можете вернуть объект, который содержит два массива, возможно даже с некоторой логикой, как использовать массивы.

Очень простой пример:

public class Result {
   public String[] array1;
   public String[] array2;
}

Result result = new Result();
result.array1 = xyz;
...

Лучше было бы поставитьнекоторая логика относительно массивов1 и 2 в объекте:

public class Result {
   private String[] array1;
   private String[] array2;
   public Result(String[] array1, String[] array2) {
      this.array1 = array1;
      this.array2 = array2;
   }

   // now some business logic like this, or just return the arrays with getters
   public int getArray1Size() {
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...