Java - вернуть 2 значения (массив строк) - PullRequest
2 голосов
/ 28 июля 2011

У меня есть этот код Java, и я хочу вернуть 2 значения, а затем использовать их в main () или в других функциях. Некоторая помощь, пожалуйста. TX:

import java.net.*;
import java.io.*;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

public class URLReader {

public  String[] functie(String x) throws Exception
{
    URL oracle = new URL(x);
    BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));
    String inputLine=null;
    StringBuffer theText = new StringBuffer();
    while ((inputLine = in.readLine()) != null)
            theText.append(inputLine+"\n");

    String html = theText.toString();
    in.close();

    String[] tds = StringUtils.substringsBetween(html, "<tr>", "</tr>");

    String[] tds2 = StringUtils.substringsBetween(tds[1], "href=\"/module/gallery", "\"><img");
    String[] tds3 = StringUtils.substringsBetween(tds[1], "src='/redx_tools/mb_image.php", "' border='1'");

    return ???

}

public static void main(String[] args) throws Exception {
    String x = new String("http://www.wippro.at/module/gallery/index.php?limitstart=0&picno=0&gallery_key=59");

    URLReader s = new URLReader();
    for (String st : s.functie(x))
    {
        System.out.println(st);
    }

}

}

Ответы [ 5 ]

8 голосов
/ 28 июля 2011

Вы строили свои струны?если a и b являются объектами String, которые вы хотите вернуть, вы можете создать массив String для возврата следующим образом:

return new String[] {a, b};

Вы создали три массива String в своем коде: tds, tds2 и tds3.Все они могут быть возвращены в большом массиве, как это:

String[] retArray = new String[tds.length+tds2.length+tds3.length];
System.arrayCopy(tds,  0, retArray, 0, tds.length);
System.arrayCopy(tds2, 0, retArray, tds.length, tds2.length);
System.arrayCopy(tds3, 0, retArray, tds.length+tds2.length, tds3.length);
return retArray
2 голосов
/ 29 июля 2011

Я задавал себе этот вопрос несколько раз в прошлом.Мой последний способ сделать это - вернуть карту.Это самый гибкий способ возврата нескольких значений.Допустим, вам нужно вернуть String, int и, возможно, даже класс.С картой (не используя дженерики) вы можете вернуть все это.Я думаю, что это лучше, чем объявлять внутренний класс, который будет служить только контейнером данных.

2 голосов
/ 28 июля 2011

Есть много решений для вашего вопроса, однако самое простое, о чем я могу подумать, это создать список, содержащий несколько значений, и вернуть весь список следующим образом:

открытый класс URLReader {

public List<String[]> functie(String x) throws Exception
{
    ...

    final String[] tds = StringUtils.substringsBetween(html, "<tr>", "</tr>");

    String[] tds2 = StringUtils.substringsBetween(tds[1], "href=\"/module/gallery", "\"><img");
    String[] tds3 = StringUtils.substringsBetween(tds[1], "src='/redx_tools/mb_image.php", "' border='1'");

    List<String[]> substrList = new ArrayList<String[]>();
    substrList.add(tds);
    substrList.add(tds2);
    substrList.add(tds3);

    return substrList;

}

public static void main(String[] args) throws Exception {
    String x = new String("http://www.wippro.at/module/gallery/index.php?limitstart=0&picno=0&gallery_key=59");

    URLReader s = new URLReader();
    for (String[] st : s.functie(x))
    {
        System.out.println(Arrays.toString(st));
    }
}

}

0 голосов
/ 29 июля 2011

Похоже, вы анализируете ссылку, на которую указывает изображение, а также некоторые свойства. Пара наблюдений:

  1. Вместо того, чтобы возвращать эти значения в некоторой анонимной коллекции (массив, список, что угодно), рассмотрите возможность создания класса, который будет держи свои ценности. Что-то вроде ImageProperties ниже. это решает вашу необходимость возвращать "несколько" значений и упрощает все Ваше последующее программирование.

  2. Как написано, вы жестко программируете зависимость от определенного формата содержимое таблицы и теги img, которые вы будете обрабатывать. Если что-нибудь Изменения (например, порядок тегов), вы сломаете. Подумайте о чем-нибудь немного более гибок в разборе.


 class ImageProperties {
   String imageHref;         // This gets what you are putting in td2
   String imageProperties;   // This gets what you are putting in td3
   // I assume you know how to create a constructor.
 }

Тогда, конечно, ваш «functie» (конечно, нуждается в более подходящем имени) вернет экземпляр ImageProperties:

 public ImageProperties[] functie(String url) throws Exception    {
    URL oracle = new URL(url);
    BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));
    String inputLine=null;
    StringBuffer theText = new StringBuffer();
    while ((inputLine = in.readLine()) != null)
            theText.append(inputLine+"\n");
    String html = theText.toString();
    in.close();
    // TODO: This parsing needs work to make it more change-resistant
    String[] tds = StringUtils.substringsBetween(html, "<tr>", "</tr>");
    String[] tds2 = StringUtils.substringsBetween(tds[1], "href=\"/module/gallery", "\"><img");
    String[] tds3 = StringUtils.substringsBetween(tds[1], "src='/redx_tools/mb_image.php", "' border='1'");
    if (tds2.length != tds3.length) {
       throw new ToldYouThisNeededChange();
    } else {
       ImageProperties[] ret = new ImageProperties[tds2.length];
       for (int ii=0; ii < tds2.length; ii++) {
          ImageProperties props = new ImageProperties(tds2[ii], tds3[ii]);
       }
       return ret;
     }
 }       
0 голосов
/ 28 июля 2011

Просто верните вектор с 2 записями: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...