Java сортировка файлов слиянием

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

SecurityAdmin/MergeFilesJava

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Проект реализован в среде разработки NetBeans IDE 8.2 на JAVA (консольное приложение). Тестовый запуск приложения осуществлялся на ОС Windows 10 Домашняя тип системы 64 — разрядная. Java Runtime Environment 1.8.0_202 Java Development Kit 1.8.0_202 Исполняемый файл MergeFilesJava.exe сгенерирован ПО Launch4j v.3.12 Исходный файл MergeFilesJava.jar

Приложение MergeFilesJava.exe запускается через консоль. Пример запуска: MergeFilesJava.exe -h (запуск справочной информации) Для запуска приложения необходимо поместить файл MergeFilesJava.exe в отдельный каталог вместе с входящими файлами. Пользователь должен иметь права записи в каталог. На рабочем месте должны быть установлены: Java Runtime Environment 1.8.0_202 (при генерации MergeFilesJava.exe указана минимальная версия Java Runtime Environment 1.005.000) Java Development Kit 1.8.0_202 Также необходимо установить переменные окружения пользователя JAVA_HOME и JRE_HOME: Пример: JAVA_HOME C:\Program Files\Java\jdk1.8.0_202 JRE_HOME C:\Program Files\Java\jre1.8.0_202

Исходные файлы проекта прилагаются (. \MergeFilesJava\src\mergefilesjava\MergeFilesJava.java). Вопросы по проекту прошу направлять на электронную почту koshelyuk_sergey@mail.ru (Кошелюк Сергей)

Тестовое задание Курс JAVA Описание задачи

Написать программу сортировки слиянием нескольких файлов. Входные файлы содержат данные одного из двух видов: целые числа или строки. Данные записаны в столбик (каждая строка файла – новый элемент). Строки могут содержать любые не пробельные символы. Считается, что файлы предварительно отсортированы. Результатом работы программы должен являться новый файл с объединенным содержимым входных файлов, отсортированным по возрастанию или убыванию путем сортировки слиянием. Если содержимое исходных файлов не позволяет произвести сортировку слиянием (например, нарушен порядок сортировки), производится частичная сортировка (насколько возможно для этого алгоритма, как именно обрабатывать поврежденный файл – на усмотрение разработчика). Выходной файл должен содержать отсортированные данные даже в случае ошибок, однако возможна потеря ошибочных данных. Необходимо самостоятельно реализовать алгоритм сортировки методом слияния и использовать его для сортировки содержимого файлов. Не использовать библиотечные функции сортировки. Алгоритм должен быть устойчив к большим файлам, не помещающимся целиком в оперативную память. Все возможные виды ошибок должны быть обработаны. Программа не должна «падать». Если после ошибки продолжить выполнение невозможно, программа должна сообщить об этом пользователю с указанием причины неудачи. Частичная обработка при наличии ошибок более предпочтительна чем останов программы. Код программы должен быть «чистым». Для реализации можно использовать любой язык программирования из списка: Java, C++, C#, Python. Решение принимается в виде исходного кода проекта. Параметры программы задаются при запуске через аргументы командной строки, по порядку:

  1. режим сортировки (-a или -d), необязательный, по умолчанию сортируем по возрастанию;
  2. тип данных (-s или -i), обязательный;
  3. имя выходного файла, обязательное;
  4. остальные параметры – имена входных файлов, не менее одного. Примеры запуска из командной строки для Windows: sort-it.exe -i -a out.txt in.txt (для целых чисел по возрастанию) sort-it.exe -s out.txt in1.txt in2.txt in3.txt (для строк по возрастанию) sort-it.exe -d -s out.txt in1.txt in2.txt (для строк по убыванию) К решению должна прилагаться инструкция по запуску. В ней также можно отображать особенности реализации, не уточненные в задании.
Читайте также:  This operator in cpp

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Программа сортировки слиянием нескольких файлов.

dodabyte/JavaTestTaskCFT

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Написать программу сортировки слиянием нескольких файлов.

Входные файлы содержат данные одного из двух видов: целые числа или строки. Данные записаны в столбик (каждая строка файла – новый элемент). Строки могут содержать любые не пробельные символы, строки с пробелами считаются ошибочными. Также считается, что файлы предварительно отсортированы.

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

Читайте также:  Алгоритм быстрой сортировки php

Если содержимое исходных файлов не позволяет произвести сортировку слиянием (например, нарушен порядок сортировки), производится частичная сортировка (насколько возможно для этого алгоритма, как именно обрабатывать поврежденный файл – на усмотрение разработчика). Выходной файл должен содержать отсортированные данные даже в случае ошибок, однако возможна потеря ошибочных данных.

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

Все возможные виды ошибок должны быть обработаны. Программа не должна «падать». Если после ошибки продолжить выполнение невозможно, программа должна сообщить об этом пользователю с указанием причины неудачи. Частичная обработка при наличии ошибок более предпочтительна чем останов программы. Код программы должен быть «чистым».

Для реализации необходимо использовать язык программирования Java, допустимо использовать стандартные системы сборки проекта (Maven, Gradle)

Решение принимается в виде исходного кода проекта.

Параметры программы задаются при запуске через аргументы командной строки, по порядку:

  1. режим сортировки (-a или -d), необязательный, по умолчанию сортируем по возрастанию;
  2. тип данных (-s или -i), обязательный;
  3. имя выходного файла, обязательное;
  4. остальные параметры – имена входных файлов, не менее одного. Примеры запуска из командной строки для Windows: sort-it.exe -i -a out.txt in.txt (для целых чисел по возрастанию) sort-it.exe -s out.txt in1.txt in2.txt in3.txt (для строк по возрастанию) sort-it.exe -d -s out.txt in1.txt in2.txt (для строк по убыванию)

К решению должна прилагаться инструкция по запуску. В ней можно отображать особенности реализации, не уточненные в задании. В частности, в инструкции необходимо указывать:

• при использовании системы сборки – указать систему сборки и ее версию;

• при использовании сторонних библиотек указать их название и версию, а также приложить ссылки на такие библиотеки (можно в формате зависимостей системы сборки).

Источник

How do i do external merge sort on binary file

This short program makes a binary file called data.bin with a bunch of randomly generated items that are 1024 bytes each. where the first 24 bytes of each item is the key. so how do i read each item from the data.bin file and do an external merge sort on it all?

import java.math.*; import java.io.*; import java.util.*; public class CreateRandomDataFile < public static void main(String[] args) throws Exception < RandomAccessFile data = new RandomAccessFile("data.bin","rws"); Random r = new Random(482010); Scanner input = new Scanner(System.in); int number = 100000; byte[] item = new byte[1024]; System.out.print("How many items (perhaps 800000)\n>"); number = input.nextInt(); for (int i=0; i data.close(); System.out.println("Done"); > > 

1 Answer 1

Making this work on any object with a comparator:

 package com.sel2in.sort; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; /** based on http://www.vogella.com/articles/JavaAlgorithmsMergesort/article.html */ public class MergeSort  < private Listitems; private List helper; private Comparator comprtr; private int cnt; public void sort(T[] values, Comparator comprtr) < items = new ArrayList(); items.addAll(Arrays.asList(values)); cnt = values.length; this.helper = new ArrayList(cnt); this.comprtr = comprtr; mergesort(0, cnt - 1); > public void sort(List values, Comparator comprtr) < items = values; //items.addAll(Arrays.asList(values)); cnt = values.size(); this.helper = new ArrayList(cnt); helper.addAll(items); this.comprtr = comprtr; mergesort(0, cnt - 1); > private void mergesort(int low, int high) < // Check if low is smaller then high, if not then the array is sorted if (low < high) < // Get the index of the element which is in the middle int middle = low + (high - low) / 2; // Sort the left side of the array mergesort(low, middle); // Sort the right side of the array mergesort(middle + 1, high); // Combine them both merge(low, middle, high); >> private void merge(int low, int middle, int high) < // Copy both parts into the helper array for (int i = low; i int i = low; int j = middle + 1; int k = low; // Copy the smallest values from either the left or the right side back // to the original array while (i else < //items[k] = helper[j]; items.set(k, helper.get(j)); j++; >k++; > // Copy the rest of the left side of the array into the target array while (i > > 

String Comparator that works on entry type — useful for you as you have key and rest of line, we could have made our own object did not have to use Entry but its already there

 package com.sel2in.sort; import java.util.Comparator; import java.util.Map.Entry; /** compare 2 strings, taken from the key of a Map entry - Tushar Kapila */ public class MapStrKeyComparator implements Comparator> < @Override public int compare(Entryo1, Entry o2) < String s = o1.getKey().toString(); String n = o2.getKey().toString(); return s.compareTo(n); >> 
 package com.sel2in.sort; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class TstMege < /** * @param args */ public static void main(String[] args) < Mapmp = new HashMap(); //here instead of the test values load from your file and seperate key and value mp.put("tt", "nxcn3er3e33"); mp.put("aa", "gjkrmt454"); mp.put("zz", "rft56GDD"); mp.put("zz", "rft56GDD"); //sort Set entries = mp.entrySet(); MapStrKeyComparator cpmr = new MapStrKeyComparator(); MergeSort sorter = new MergeSort(); //sort. sort(List values, Comparator comprtr) ArrayList lst = new ArrayList(entries.size()); lst.addAll(entries); System.out.println("before " + lst); sorter.sort(lst, cpmr); System.out.println("sorted " + lst); > > 
before [tt=nxcn3er3e33, zz=rft56GDD, aa=gjkrmt454] sorted [aa=gjkrmt454, tt=nxcn3er3e33, zz=rft56GDD] 
package com.sel2in.sort; import java.util.Map.Entry; public class TEntry implements Entry  < final K key; V value; TEntry()< key = null; >TEntry(K k) < key = k; >TEntry(K k, V v) < value = v; key = k; >@Override public K getKey() < return key; >@Override public V getValue() < return value; >@Override public V setValue(V newValue) < V oldValue = value; value = newValue; return oldValue; >public String toString() < return key + ":" + value; >//can copy hashcode , equals but not important now > 

File read binary and sort

 package com.sel2in.sort; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.Arrays; import java.util.Map.Entry; public class TstFileMegeSort < /** * @param args */ public static void main(String[] args) < //Mapmp = new HashMap(); ArrayList lst = new ArrayList (); TEntry en = null; //here instead of the test values load from your file and seperate key and value try < RandomAccessFile data = new RandomAccessFile("data.bin","rws"); long l = data.length(); long recs = l / 1024; long cnt = 0; byte []b = new byte[1024]; while(cnt < recs)< cnt++; data.readFully(b); byte []key = Arrays.copyOfRange(b, 0, 24); byte []value = Arrays.copyOfRange(b, 24, 1024); en = new TEntry(new String(key), new String(value)); lst.add(en); > > catch (Exception e) < // TODO Auto-generated catch block e.printStackTrace(); >//sort //Set entries = mp.entrySet(); MapStrKeyComparator cpmr = new MapStrKeyComparator(); MergeSort sorter = new MergeSort(); //sort. sort(List values, Comparator comprtr) //ArrayList lst = new ArrayList(entries.size()); //lst.addAll(entries); System.out.println("before " + lst); sorter.sort(lst, cpmr); System.out.println("sorted " + lst); > > 

Источник

Оцените статью