Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 4 Java

.docx
Скачиваний:
2
Добавлен:
31.08.2024
Размер:
177.31 Кб
Скачать

ProductList

package lab_3;

import java.lang.reflect.Field;

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

import java.util.Random;

public class ProductList {

private ArrayList<Product> arrayList;

private LinkedList<Product> linkedList;

private LogProcessor logProcessor;

private long[] timeInformation;

//private ArrayList<Long> changeTime;

private static final int[] COLLECTION_SIZES = {10, 100, 1000, 10000, 100000};

private static final double REMOVAL_PERCENTAGE = 0.1;

private static final String LOG_FILE_PREFIX = "log_";

private static final String LOG_FILE_EXTENSION = ".txt";

public ProductList() {

arrayList = new ArrayList<>();

linkedList = new LinkedList<>();

logProcessor = new LogProcessor();

timeInformation = new long[4];

//changeTime = new ArrayList<>();

}

public long[] generateCollection(String collectionType, List<Product> collection, int size) {

String logFileName = LOG_FILE_PREFIX + collectionType + "_" + size + LOG_FILE_EXTENSION;

Random random = new Random();

logProcessor.writeHeadLog(logFileName, getCurrentDateTime(), collectionType);

//System.out.println("Размер:" + size);

long startTime;

//System.out.println("Размер коллекции:" + size);

//System.out.println("Коллекция:" + collection);

int capacity = 10;

long sumAddTotalTime = 0;

long currentTime = 0;

long oldTime = 0;

for (int i = 0; i < size; i++) {

// capacity = ((ArrayList<Product>) collection).trimToSize() + 1;

//((ArrayList<Product>) collection).trimToSize();

//System.out.println("Размер коллекции:" + collection.size());

//int capacity = collection.size() + 1;

//Product product = collection.get(i);

String randomType = generateRandomString();

Product product = new Product(randomType);

startTime = System.nanoTime();

collection.add(product);

currentTime = getCurrentTimeDifference(startTime);

logProcessor.writeAdd(logFileName, currentTime, i);

//writer.println("add, ID = " + (i + 1) + ", " + currentTime);

//product.load();

sumAddTotalTime += currentTime;

if ((i == 10 || i == 0) && collectionType.equals("ArrayList")) {

//changeTime.add(sumAddTotalTime/i);

System.out.println("Время добавления при размере ArrayList " + (i+1) + ": "+ currentTime );

//oldTime = sumAddTotalTime;

capacity = (int) ((capacity * 3)/2 + 1);

}

if (((i+1) == capacity && (i+1) != 10) && collectionType.equals("ArrayList")) {

//changeTime.add(sumAddTotalTime/i);

System.out.println("Время добавления при размере ArrayList " + (i+1) + ": "+ currentTime );

oldTime = sumAddTotalTime;

capacity = (int) ((capacity * 3)/2 + 1);

}

}

//System.out.println("Коллекция: " + collection);

long addTotalCount = size;

long addTotalTime = sumAddTotalTime;

long addMedianTime = sumAddTotalTime / size;

logProcessor.writeAddInformation(logFileName, addTotalCount, addTotalTime, addMedianTime);

int removalCount = (int) (size * REMOVAL_PERCENTAGE);

//System.out.println("Количество удалений:" + removalCount);

//Iterator<Product> iterator = collection.iterator();

//startTime = System.nanoTime();

currentTime = 0;

long sumRemoveTotalTime = 0;

for (int i = 0; i < removalCount; i++) {

int randomIndex = new Random().nextInt(collection.size());

startTime = System.nanoTime();

collection.remove(randomIndex);

//Product product = collection.get(randomIndex);

currentTime = getCurrentTimeDifference(startTime);

logProcessor.writeRemove(logFileName, currentTime, randomIndex);

//writer.println("remove, ID = " + (randomIndex + 1) + ", " + currentTime);

//product.load();

sumRemoveTotalTime += currentTime;

}

long removeTotalCount = removalCount;

long removeTotalTime = sumRemoveTotalTime;

long removeMedianTime = sumRemoveTotalTime / removalCount;

logProcessor.writeRemoveInformation(logFileName, removeTotalCount, removeTotalTime, removeMedianTime);

logProcessor.writeEndLog(logFileName, getCurrentDateTime());

//System.out.println("Файл: " + logFileName + " создан и заполнен успешно.");

//System.out.println("Коллекция c удалением: " + collection);

timeInformation[0] = addTotalTime;

timeInformation[1] = addMedianTime;

timeInformation[2] = removeTotalTime;

timeInformation[3] = removeMedianTime;

//System.out.println(timeInformation[0]);

return timeInformation;

}

public String generateRandomString() {

String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Random random = new Random();

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 6; i++) {

int index = random.nextInt(characters.length());

char randomChar = characters.charAt(index);

sb.append(randomChar);

}

return sb.toString();

}

public void generateCollections() {

for (int size : COLLECTION_SIZES) {

arrayList = new ArrayList<>();

linkedList = new LinkedList<>();

long[] aList = generateCollection("ArrayList", arrayList, size);

long[] arrList = new long[4];

System.arraycopy(aList, 0, arrList, 0, aList.length);

//System.out.println(arrList);

long[] linkList = generateCollection("LinkedList", linkedList, size);

//System.out.println(arrList[0]);

//System.out.println(linkList[0]);

//logProcessor.writeLog("ArrayList", arrayList, size);

//logProcessor.writeLog("LinkedList", linkedList, size);

if (arrList[0] > linkList[0]) {

System.out.println("Общее время выполнения добавления меньше у LinkedList.");

}

if (arrList[0] < linkList[0]) {

System.out.println("Общее время выполнения добавления меньше у ArrayList.");

}

if (arrList[0] == linkList[0]) {

System.out.println("Общее время выполнения добавления одинаково.");

}

if (arrList[1] > linkList[1]) {

System.out.println("Среднее время выполнения добавления меньше у LinkedList.");

}

if (arrList[1] < linkList[1]) {

System.out.println("Среднее время выполнения добавления меньше у ArrayList.");

}

if (arrList[1] == linkList[1]) {

System.out.println("Среднее время выполнения добавления одинаково.");

}

if (arrList[2] > linkList[2]) {

System.out.println("Общее время выполнения удаления меньше у LinkedList.");

}

if (arrList[2] < linkList[2]) {

System.out.println("Общее время выполнения удаления меньше у ArrayList.");

}

if (arrList[2] == linkList[2]) {

System.out.println("Общее время выполнения удаления одинаково.");

}

if (arrList[3] > linkList[3]) {

System.out.println("Среднее время выполнения удаления меньше у LinkedList.");

}

if (arrList[3] < linkList[3]) {

System.out.println("Среднее время выполнения удаления меньше у ArrayList.");

}

if (arrList[3] == linkList[3]) {

System.out.println("Среднее время выполнения удаления одинаково.");

}

System.out.println("Разница в нансекундах между общим и средним временем добавления в ArrayList: " + Math.abs(arrList[0] - arrList[1]));

System.out.println("Разница в нансекундах между общим и средним временем удаления в ArrayList: " + Math.abs(arrList[2] - arrList[3]));

System.out.println("Разница в нансекундах между общим и средним временем добавления в LinkedList: " + Math.abs(linkList[0] - linkList[1]));

System.out.println("Разница в нансекундах между общим и средним временем удаления в LinkedList: " + Math.abs(linkList[2] - linkList[3]));

System.out.println("\n");

arrayList.clear();

linkedList.clear();

}

}

private String getCurrentDateTime() {

LocalDateTime currentDateTime = LocalDateTime.now();

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");

return currentDateTime.format(formatter);

}

private long getCurrentTimeDifference(long startTime) {

return System.nanoTime() - startTime;

}

/*

static int getCapacity(ArrayList<?> list) {

Field dataField = ArrayList.class.getDeclaredField("elemData");

dataField.setAccessible(true);

return ((Object[]) dataField.get(list)).length;

}

*/

/*

public void trimToSize(ArrayList<Product> list) {

super.trimToSize();

}

*/

}

LogProcessor

package lab_3;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileWriter;

import java.io.PrintWriter;

import java.sql.Date;

import java.text.DecimalFormat;

import java.text.SimpleDateFormat;

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;

import java.util.List;

import java.util.Random;

public class LogProcessor{

private static final String LOG_FILE_PREFIX = "log_";

private static final String LOG_FILE_EXTENSION = ".txt";

//private ErrorProcessor errorCount;

private int errorCount;

//private PrintWriter writer;

//private ProductList productList;

public LogProcessor() {

errorCount = 0;

}

public void writeHeadLog(String logFileName, String currentTime, String collectionType) {

try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFileName))) {

writer.write("Start program: " + currentTime);

writer.newLine();

writer.write(collectionType);

writer.newLine();

} catch (FileNotFoundException e) {

handleError("Ошибка при записи в файл: " + logFileName);

//errorCount.processError("Ошибка при записи в файл: " + logFileName);

}catch (Exception e) {

handleError("Ошибка в методе writeHeadLog");

//errorCount.processError("Ошибка в методе writeHeadLog");

}

}

public void writeAdd(String logFileName, long currentTime, int i) {

try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFileName, true))) {

writer.write("add, ID = " + (i + 1) + ", " + currentTime);

writer.newLine();

} catch (FileNotFoundException e) {

handleError("Ошибка при записи в файл: " + logFileName);

//errorCount.processError("Ошибка при записи в файл: " + logFileName);

}catch (Exception e) {

handleError("Ошибка в методе writeAdd");

//errorCount.processError("Ошибка в методе writeAdd");

}

}

public void writeAddInformation(String logFileName, long addTotalCount, long addTotalTime, long addMedianTime) {

try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFileName, true))) {

writer.write("addTotalCount = " + addTotalCount);

writer.newLine();

writer.write("addTotalTime = " + addTotalTime);

writer.newLine();

writer.write("addMedianTime = " + addMedianTime);

writer.newLine();

} catch (FileNotFoundException e) {

handleError("Ошибка при записи в файл: " + logFileName);

//errorCount.processError("Ошибка при записи в файл: " + logFileName);

}catch (Exception e) {

handleError("Ошибка в методе writeAddInformation");

//errorCount.processError("Ошибка в методе writeAddInformation");

}

}

public void writeRemove(String logFileName, long currentTime, int i) {

try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFileName, true))) {

writer.write("remove, ID = " + (i + 1) + ", " + currentTime);

writer.newLine();

} catch (FileNotFoundException e) {

handleError("Ошибка при записи в файл: " + logFileName);

//errorCount.processError("Ошибка при записи в файл: " + logFileName);

}catch (Exception e) {

handleError("Ошибка в методе writeRemove");

//errorCount.processError("Ошибка в методе writeRemove");

}

}

public void writeRemoveInformation(String logFileName, long removeTotalCount, long removeTotalTime, long removeMedianTime) {

try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFileName, true))) {

writer.write("removeTotalCount = " + removeTotalCount);

writer.newLine();

writer.write("removeTotalTime = " + removeTotalTime);

writer.newLine();

writer.write("removeMedianTime = " + removeMedianTime);

writer.newLine();

} catch (FileNotFoundException e) {

handleError("Ошибка при записи в файл: " + logFileName);

//errorCount.processError("Ошибка при записи в файл: " + logFileName);

}catch (Exception e) {

handleError("Ошибка в методе writeRemoveInformation");

//errorCount.processError("Ошибка в методе writeRemoveInformation");

}

}

public void writeEndLog(String logFileName, String currentTime) {

try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFileName, true))) {

writer.write("Finish program: " + currentTime);

writer.newLine();

System.out.println("Файл: " + logFileName + " создан и заполнен успешно.");

} catch (FileNotFoundException e) {

handleError("Ошибка при записи в файл: " + logFileName);

//errorCount.processError("Ошибка при записи в файл: " + logFileName);

}catch (Exception e) {

handleError("Ошибка в методе writeEndLog");

//errorCount.processError("Ошибка в методе writeEndLog");

}

}

private void handleError(String errorMessage) {

System.err.println(errorMessage);

errorCount++;

}

public int getErrorCount() {

return errorCount;

}

public String generateRandomString() {

String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Random random = new Random();

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 6; i++) {

int index = random.nextInt(characters.length());

char randomChar = characters.charAt(index);

sb.append(randomChar);

}

return sb.toString();

}

}

ErrorProcessor

package lab_3;

public class ErrorProcessor {

private int errorCount;

public ErrorProcessor() {

errorCount = 0;

}

public void processError(String errorMessage) {

System.err.println(errorMessage);

errorCount++;

}

public int getErrorCount() {

return errorCount;

}

public void setErrorCount(int c) {

errorCount = c;

}

}

Main

ProductList generator = new ProductList();

generator.generateCollections();

LogProcessor logProcessor = new LogProcessor();

//ErrorProcessor errorProcessor = new ErrorProcessor();

int errorCount = logProcessor.getErrorCount();

if (errorCount > 0) {

System.out.println("Количество ошибок: " + errorCount);

} else {

System.out.println("Всё успешно выполнено.");

}

Соседние файлы в предмете Основы языка Java