2016-04-14 6 views
0

Я относительно новичок в Java, поэтому мне нужно постоянно искать, как делать вещи. Я работаю над проектом, который включает в себя анализ ряда знакомых типов, таких как сортировка кучи, сортировка слияния и т. Д. Я написал немного кода для создания множества различных массивов, каждый в своем собственном .txt-файле. Вот часть кода:Java-чтение целых массивов из нескольких файлов

import java.io.*; 
import java.util.Arrays; 
import java.util.Collections; 

public class ArrayBuilder { 

public static void main(String[] args) throws IOException { 
    for(int i = 2; i < 7; i++) { 
     int aLength = (int)Math.pow(10, i); 
     buildAscendingArray(aLength); 
     buildDescendingArray(aLength); 
     buildRandomArray(aLength); 
    } 
} 
public static void buildAscendingArray(int arrayLength) throws IOException { 
    File file = new File("arrays_" + arrayLength + "A.txt"); 
    PrintWriter printWriter = new PrintWriter(file); 
    int[] array = new int[arrayLength]; 
    for(int i = 0; i < array.length; i++) { 
     array[i] = i + 1; 
    } 
    printWriter.println(Arrays.toString(array)); 
    printWriter.close(); 
} 

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

У меня уже есть все виды кодированных, я просто пытаюсь понять, как читать в массивах с целыми числами, чтобы я мог запускать их через разные типы. Я также пытаюсь добавить значение в System.nanoTime(), чтобы синхронизировать время, необходимое для запуска каждого типа, чтобы я мог сравнивать их с учетом различных входных данных. Не уверен, что это нужно добавить в метод для каждого вида или же он может быть реализован в вызове ie. System.nanoTime (heapsort (array)))?

В конечном счете, я ищу помощь в получении файлов .txt в полезный массив, чтобы передавать его через каждый вид. В первую очередь я выводю все в текстовые файлы, чтобы убедиться, что один и тот же массив запускается через каждый вид.

Я знаком со Сканером, но также прочитал о FileRead и/или BufferedReader и, возможно, о некоторых других подходах. Я просто недостаточно опытен, чтобы знать, что будет лучше всего работать в этой ситуации и лучший способ его реализации. Помощь будет высоко оценена.

+0

Зачем вам нужно сохранить восходящий и нисходящий массивы? Разве эта логика не создавала бы такой же массив каждый раз? –

+0

Вам действительно нужны текстовые файлы или просто хранилище файлов? Если вам просто нужно хранить файлы, вы можете записать массив как есть в файл и прочитать его напрямую с помощью ObjectOutputStream и ObjectInputStream. –

+0

У меня уже есть текстовые файлы, независимо от того, является ли это наиболее эффективным способом делать вещи, не имеет значения. Я просто ищу помощь в том, как действовать, а не как начать все заново. На мой взгляд, это помогает с точки зрения разделения различных аспектов программы в целом. – TheDubiousDubber

ответ

0

Если вам просто нужно сохранить массивы в хранилище файлов и построить их обратно, вы можете использовать сериализацию.

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

public class ArrayReaderWriter { 

    public static void main(String[] args) throws Exception { 
     writeArray(20); 
     readArray(20); 
    } 

    public static void writeArray(int arrayLength) throws IOException { 
     File file = new File("arrays_" + arrayLength + "A.ser"); 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file)); 
     int[] array = new int[arrayLength]; 
     for (int i = 0; i < array.length; i++) { 
      array[i] = i + 1; 
     } 
     os.writeObject(array); 
    } 

    public static void readArray(int arrayLength) throws IOException, ClassNotFoundException { 
     File file = new File("arrays_" + arrayLength + "A.ser"); 
     ObjectInputStream is = new ObjectInputStream(new FileInputStream(file)); 
     int[] array = (int[]) is.readObject(); 
     // Printing here to verify 
     for (int i = 0; i < array.length; i++) { 
      System.out.println(array[i]); 
     } 
    } 

} 

Примечание: Я могу понять сохранение случайного массива, если вы хотите запустить различные виды с тем же массивом в различных исполнениях. Но восходящие и нисходящие массивы всегда могут быть построены при каждом исполнении.

Что касается System.nanoTime()

https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime-- Смотрите для подробного объяснения.

EDIT

Если вы уже генерировали текстовые файлы с помощью решения @Antoniossss. Вам нужно будет только изменить разделитель, как я упоминал в своем комментарии, так как вы читаете существующие файлы.

Тест

Scanner scanner = new Scanner("[1, 2, 3]"); 
scanner.useDelimiter("(\\s)*[\\[,\\]](\\s)*"); 
while(scanner.hasNextInt()) { 
    System.out.println(scanner.nextInt()); 
} 

Выход

1 
2 
3 
+0

Мне нравится идея, хотя я не уверен, сколько потребуется переупорядочить в моем случае. В настоящее время я уже создал файлы .txt, как указано. Алгоритмы сортировки находятся в разных классах в рамках другого проекта в Eclipse. Если бы я пошел этим путем, единственный способ, которым я знал бы, как реализовать это, - поставить этот код в тот же класс, что и класс со всеми моими типами, чтобы все было сделано сразу. Не уверен, что это может создать проблемы с точки зрения отладки, поскольку, поскольку она может работать в течение нескольких часов, если она компилируется, я не буду знать об ошибках до тех пор, пока это не произойдет. – TheDubiousDubber

+0

На самом деле было не так сложно изменить код на ваше предложение и работать с методом readArray в моем классе sortAnalysis, теперь я просто работаю оттуда. Думаю, в конце концов это будет немного легче. Спасибо за вашу помощь! – TheDubiousDubber

0

Использование некоторых delimetered формат файла для таких целей, и читать его с помощью сканера. Давайте скажем, что наш делиметр - это символ ;.Храните массив как этот

File file = new File("arrays_" + arrayLength + "A.txt"); 
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file))); 
printWriter.print(1); 
for(int i = 1; i < array.length; i++) { 
    printWriter.print(';'); // delimeter 
    printWriter.print(i+1); 
} 
printWriter.close(); 

Чтобы прочитать его обратно, используйте Scanner в пути всего напоминает следующий код;

ArrayList<Integer> arr=new ArrayList<>(); 
Scanner scan=new Scanener(new File("yourfile)); 
scan.useDelimeter(';'); 
while(scan.hasNextInt()){ 
    arr.add(scan.nextInt()); 
} 

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

EDIT: Если вам не нужен массив, хранящийся в форме, доступной для человека, вы можете использовать сериализацию так же, как @Shire Resident, объясненную в его ответе.

+0

То, как я это сделал, в настоящее время каждый текстовый файл отформатирован [1, 2, 3, ..., n]. Можно ли использовать запятую как разделитель, поскольку это уже существует или я не понимаю, как это используется? – TheDubiousDubber

+0

@ TheDubiousDubber Вы можете использовать запятую, но те скобки и пробелы вызовут проблему - используйте scanner.useDelimiter ("(\\ s) * [\\\ [, \\\]] (\\ s) *"); Это должно только оставить цифры. –

Смежные вопросы