2014-09-28 1 views
0

Я хочу вернуть массив, доступный другим объектам после чтения текстового файла. Моя инструкция класс разбора:Как я могу вернуть массив в java, доступный для других объектов?

import java.io.*; 

public class Instruction { 
    public String[] instructionList; 

    public String[] readFile() throws IOException { 
     FileInputStream in = new FileInputStream("directions.txt"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

     int n = 5; 
     instructionList = new String[n]; 

     for (int j = 0; j < instructionList.length; j++) { 
      instructionList[j] = br.readLine(); 
     } 
     in.close(); 
     return instructionList; 
    } 

}

выше занимает в текстовом файле с 5 строк текста в нем. В моей main() я хочу запустить эту функцию и получить массив строк для других объектов.

import java.util.Arrays; 
public class RoverCommand { 

    public static void main(String[] args) throws Exception { 
     Instruction directions = new Instruction(); 
     directions.readFile(); 

     String[] directionsArray; 
     directionsArray = directions.returnsInstructionList(); 

     System.out.println(Arrays.toString(directionsArray)); 
    } 

}

Какой самый лучший способ сделать это? Мне нужно, чтобы элементы массива были целыми числами, если они являются числами и строками, если они являются буквами. Постскриптум Я новичок в Java. есть ли лучший способ сделать то, что я делаю?

+0

Ваш вопрос не ясен для меня. Чего вы пытаетесь достичь? – Dici

+0

Я хочу прочитать текстовый файл, сохранить содержимое этого файла в массиве и получить доступ к этому массиву для других объектов. Я пытаюсь сделать этот вызов Mars Rover. У меня также нет опыта работы на Java. – mendoncakr

+0

Работает ли ваш код? Это кажется прекрасным способом сделать это. Кроме того, вы можете вернуть массив непосредственно из 'readFile()', но это дизайнерское решение, которое зависит от других ограничений. –

ответ

1

Вы не должны использовать дженерики. Я пытаюсь поймать исключения в аксессуарах и вернуть null, если что-то взорвется. Таким образом, вы можете проверить, является ли возвращаемое значение нулевым, прежде чем продолжить.

// Client.java 
import java.io.IOException; 

public class Client { 
    public static void main(String args[]) { 
     try { 
      InstructionList il = new InstructionList(); 
      il.readFile("C:\\testing\\ints.txt", 5); 

      int[] integers = il.getInstructionsAsIntegers(); 

      if (integers != null) { 
       for (int i : integers) { 
        System.out.println(i); 
       } 
      } 
     } catch (IOException e) { 
      // handle 
     } 
    } 
} 


// InstructionList.java 
import java.io.*; 

public class InstructionList { 
    private String[] instructions; 

    public void readFile(String path, int lineLimit) throws IOException { 
     FileInputStream in = new FileInputStream(path); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

     instructions = new String[lineLimit]; 

     for (int i = 0; i < lineLimit; i++) { 
      instructions[i] = br.readLine(); 
     } 

     in.close(); 
    } 

    public String[] getInstructionsAsStrings() { 
     return instructions; // will return null if uninitialized 
    } 

    public int[] getInstructionsAsIntegers() { 
     if (this.instructions == null) { 
      return null; 
     } 

     int[] instructions = new int[this.instructions.length]; 

     try { 
      for (int i = 0; i < instructions.length; i++) { 
       instructions[i] = new Integer(this.instructions[i]); 
      } 
     } catch (NumberFormatException e) { 
      return null; // data integrity fail, return null 
     } 

     return instructions; 
    } 
} 
+0

Хотя код OP может быть улучшен с помощью некоторой базовой обработки исключений (особенно для предотвращения утечек ресурсов), это не затрагивает первоначальный вопрос, связанный с проблемами дизайна. –

+0

@ Code-Apprentice Я не уверен, с чем он столкнулся. Если ему нужен один объект для доступа к первому и второму элементам, он может просто использовать оператор индекса [] для их получения. Как 'getInstructionsAsIntegers() [1]'. Каково ваше решение его проблемы? – scottyeatscode

+0

Я, вероятно, сохранил бы возвращаемое значение в переменной, а затем проиндексировал бы его, а не индексировал бы вызов метода напрямую. –

0

Нет гарантии, что readFile вызывается перед возвратом. Возвращается методInstructionList. Оставляя вас returnInstructionList, возвращающий null.

я бы:

public String[] getContentsFromFile(String fileName) throws IOException { 
    FileInputStream in = new FileInputStream(fileName); 
    BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

    int n = 5; 
    instructionList = new String[n]; 

    for (int j = 0; j < instructionList.length; j++) { 
     instructionList[j] = br.readLine(); 
    } 
    in.close();  
    return instructionList; 
} 

Часть два вопроса вы можете использовать дженерики. Чтобы достичь того, чего вы хотите, но вы должны включить способ сказать, что это такое.

Например

public class Foo { 
    public ReturnForFoo returnAStringOrIntger(boolean val) { 
     if(val){ 
     return new ReturnForFoo("String", ValueType.STRING) ; 
     } 
     return new ReturnForFoo(10, ValueType.INTEGER); //int 
    } 
} 

public class ReturnForFoo { 
    Object value; 
    ValueType type; 

    public ReturnForFoo(Object value, ValueType type) { 
     this.value=value; 
     this.type=type 
    } 
    // Asume you have getters for both value and value type 
    public static ENUM ValueType { 
      STRING, 
      INTEGER, 
      UNKNOWN 
    } 
} 

Этот код в ваш главный.

Foo foo = new Foo(); 
String value; 
int val; 
ReturnForFoo returnForFoo = foo.returnAStringOrIntger(true); 
// NOTE you can use switch instead of if's and else if's. It will be better 
if(returnForFoo.getValueType().equals(ValueType.INTEGER)){ 
    val = (int) returnForFoo.getValue(); 
} else if(returnForFoo.getValueType().equals(ValueType.STRING)){ 
    value = (String) returnForFoo.getValue(); 
} else { 
    // UNKOWN Case 
} 
+0

Первое предложение неверно, и последняя часть является неприятным решением. – Dici

+0

@ Dici вы можете помочь нам улучшить ответ о том, как мы можем использовать дженерики. – StackFlowed

+0

Ну, я прочитал описание проблемы, и, похоже, это плохая идея сохранить все строки в одном массиве. Логичнее было бы проанализировать файл с помощью «Сканера» и сохранить значения в некоторых переменных ожидаемого типа, так как вы точно знаете, как выглядит вход. – Dici

0

проверка инструкцияList - null или нет. если он равен нулю, вызовите метод readFile.

public String[] returnsInstructionList() { 
     if (instructionList== null){ 
      try { readFile(); } catch(Exception e){} 
     } 
     return instructionList; 
} 

из-за того, что readFile может создавать исключения, было бы полезно использовать одну дополнительную переменную. как:

private boolean fileReaded = false; 
public String[] returnsInstructionList() { 
     if (!fileReaded){ 
      fileReaded = true; 
      try { readFile(); } catch(Exception e){} 
     } 
     return instructionList; 
} 

и если ReadFile могут работать одновременно, самый простой способ сделать функцию синхронизации как

private boolean fileReaded = false; 
public synchronized void readFile() throws IOException { 
    . 
    . 
    .   
} 
public synchronized String[] returnsInstructionList() { 
     if (!fileReaded){ 
      fileReaded = true; 
      try { readFile(); } catch(Exception e){} 
     } 
     return instructionList; 
} 
Смежные вопросы