Привести запись из файла символов к записи в массив
Заданием было реализовать алгоритм сортировки TimSort, а так же реализовать считывание с файла, проведение сортировки считавшихся данных и обратная запись в файл. Каким образом мне правильно нужно записать в массив? В методе main после Scanner ругается IDE
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
// Java program to perform TimSort.
class GFG {
static int MIN_MERGE = 32;
public static int minRunLength(int n)
{
assert n >= 0;
// Becomes 1 if any 1 bits are shifted off
int r = 0;
while (n >= MIN_MERGE)
{
r |= (n & 1);
n >>= 1;
}
return n + r;
}
// This function sorts array from left index to
// to right index which is of size atmost RUN
public static void insertionSort(int[] arr, int left,
int right)
{
for (int i = left + 1; i <= right; i++)
{
int temp = arr[i];
int j = i - 1;
while (j >= left && arr[j] > temp)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
// Merge function merges the sorted runs
public static void merge(int[] arr, int l,
int m, int r)
{
// Original array is broken in two parts
// left and right array
int len1 = m - l + 1, len2 = r - m;
int[] left = new int[len1];
int[] right = new int[len2];
for (int x = 0; x < len1; x++)
{
left[x] = arr[l + x];
}
for (int x = 0; x < len2; x++)
{
right[x] = arr[m + 1 + x];
}
int i = 0;
int j = 0;
int k = l;
// After comparing, we merge those two array
// in larger sub array
while (i < len1 && j < len2)
{
if (left[i] <= right[j])
{
arr[k] = left[i];
i++;
}
else {
arr[k] = right[j];
j++;
}
k++;
}
// Copy remaining elements
// of left, if any
while (i < len1)
{
arr[k] = left[i];
k++;
i++;
}
// Copy remaining element
// of right, if any
while (j < len2)
{
arr[k] = right[j];
k++;
j++;
}
}
// Iterative Timsort function to sort the
// array[0...n-1] (similar to merge sort)
public static void timSort(int[] arr, int n)
{
int minRun = minRunLength(MIN_MERGE);
// Sort individual subarrays of size RUN
for (int i = 0; i < n; i += minRun)
{
insertionSort(arr, i,
Math.min((i + 31), (n - 1)));
}
// Start merging from size
// RUN (or 32). It will
// merge to form size 64,
// then 128, 256 and so on
// ....
for (int size = minRun; size < n; size = 2 * size)
{
// Pick starting point
// of left sub array. We
// are going to merge
// arr[left..left+size-1]
// and arr[left+size, left+2*size-1]
// After every merge, we
// increase left by 2*size
for (int left = 0; left < n;
left += 2 * size)
{
// Find ending point of left sub array
// mid+1 is starting point of right sub
// array
int mid = left + size - 1;
int right = Math.min((left + 2 * size - 1),
(n - 1));
// Merge sub array arr[left.....mid] &
// arr[mid+1....right]
merge(arr, left, mid, right);
}
}
}
// Utility function to print the Array
public static void printArray(int[] arr, int n)
{
for (int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
}
System.out.print("\n");
}
public static void main(String[] args) throws IOException {
ArrayList<String> list = new ArrayList<>();
int[] arr = new int[];
int n = arr.length;
timSort(arr, n);
try (Scanner scan = new Scanner(new File("text.txt"))) {
while (scan.hasNextLine()) {
arr.add(scan.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
InputStream input = new FileInputStream("input.txt");
int size = input.available();
for (int j = 0; j < size; j++) {
System.out.print((char) input.read() + " "); // Чтение текстового файла посимвольно
arr.add(char);
}
OutputStream output = new FileOutputStream("file.txt"); // Создание текстового файла
for(int i = 0; i < arr.length; i++) {
output.write(arr[i]); // Запись каждого символа в текстовый файл
}
output.close();
}catch(IOException e) {
System.out.print("Exception");
}
System.out.println("Given Array is");
printArray(arr, n);
System.out.println("After Sorting Array is");
printArray(arr, n);
}
}
UPD: Числа во входном файле записаны в одну строку, разделены пробелом, диапазон 0 - 99999
Ответы (2 шт):
Если коротко - вот:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
if (args.length < 1) return;
try (Scanner scan = new Scanner(new FileInputStream(args[0]))) {
ArrayList<Integer> list = new ArrayList<>();
while (scan.hasNextInt()) {
list.add(scan.nextInt());
}
System.out.println(list);
} catch (FileNotFoundException e) {
System.err.println("File " + args[0] + " not found");
}
}
}
Так как количество чисел не известно заранее - используем ArrayList.
Объект Scanner я создаю в скобочках у блока try, чтобы задействовать автоматическое управление ресурсами.
Далее просто читаем файл и добавляем в list. Можно разделять числа не только пробелами, но и например, переносами строк, табами и т.д.
Если это не алгоритмическая задача, то можно сделать при помощи стримов:
int nums[] = Files
.lines(Path.of("/path_to_file/nums.txt"))
.flatMap(s -> Stream.of(s.split(" ")))
.mapToInt(s -> Integer.valueOf(s))
.toArray();