From 4c2d3db89c63c257bfb13783d21f27ec19597cbd Mon Sep 17 00:00:00 2001 From: Brandon Rodriguez <brodriguez8774@gmail.com> Date: Wed, 27 Sep 2017 14:56:35 -0400 Subject: [PATCH] Implement basic search functionality --- a0/src/com/CS3310/a0/Controller.java | 235 ++++++++++++++---- ...uteTimeTest.java => ComputeTimeTests.java} | 2 +- 2 files changed, 183 insertions(+), 54 deletions(-) rename a0/src/com/CS3310/a0/tests/{ComputeTimeTest.java => ComputeTimeTests.java} (99%) diff --git a/a0/src/com/CS3310/a0/Controller.java b/a0/src/com/CS3310/a0/Controller.java index 1dd381f..7a8f435 100644 --- a/a0/src/com/CS3310/a0/Controller.java +++ b/a0/src/com/CS3310/a0/Controller.java @@ -2,6 +2,7 @@ package com.CS3310.a0; import java.util.Arrays; +import java.util.Date; import java.util.Random; import java.util.Scanner; @@ -12,14 +13,13 @@ import java.util.Scanner; public class Controller { //region Variables - private int arrayIndex1; - private int arrayIndex2; private int arrayDim1; private int arrayDim2; - private String tempString; - private char[][] charArray; + private char[][] unsortedArray; + private char[] sortedArray; private Random random = new Random(); private Scanner reader = new Scanner(System.in); + private ComputeTime computeTime = new ComputeTime(); //endregion Variables @@ -32,35 +32,38 @@ public class Controller { */ public Controller() { boolean runProgram = true; + String userInputString; while (arrayDim1 < 1 || arrayDim2 < 1) { GetArrayDimensions(); } - CreateArray(); + RunCore(); PrintHelp(); while (runProgram) { - tempString = GetUserInput(); - switch (tempString) { - case "help": - PrintHelp(); - break; - case "dimensions": - GetArrayDimensions(); - CreateArray(); - break; - case "sort": - Sort2DArray(); - break; - case "print": - Print2DArray(); - break; - case "exit": + //userInputString = GetUserInput(); +// switch (tempString) { +// case "help": +// PrintHelp(); +// break; +// case "dimensions": +// GetArrayDimensions(); +// CreateArray(); +// break; +// case "sort": +// SortArray(); +// break; +// case "print": +// PrintUnsortedArray(); +// break; +// case "exit": runProgram = false; - default: - SearchName(tempString); - } +// break; +// default: +// SearchName(tempString); +// break; +// } } } @@ -72,15 +75,38 @@ public class Controller { //region Array Management Methods + + /** + * Core functionality of program. + */ + private void RunCore() { + String userInputString = GetUserInput("Enter a name to search: "); + + CreateArray(); + PrintUnsortedArray(); + SearchNameUnsorted(userInputString); + + SortArray(); + PrintSortedArray(); + SearchNameSorted(userInputString); + } + + /** * Creates initial 2D array. * Values are filled in with random lowercase letters. */ private void CreateArray() { + int arrayIndex1; + int arrayIndex2; int randomInt; char[] tempChar; +// Date startDate = new Date(); +// Date endDate; +// long timeResult; - charArray = new char[arrayDim1][arrayDim2]; + unsortedArray = new char[arrayDim1][arrayDim2]; + sortedArray = new char[arrayDim1 * arrayDim2]; // Populate array with random lowercase characters. for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) { @@ -88,38 +114,37 @@ public class Controller { randomInt = random.nextInt(26); randomInt = randomInt + 97; // Set to valid ascii codes. tempChar = Character.toChars((char) randomInt); - charArray[arrayIndex1][arrayIndex2] = tempChar[0]; + unsortedArray[arrayIndex1][arrayIndex2] = tempChar[0]; } } + +// // Get time lapse of process. +// System.out.print("Array Creation Time: "); +// endDate = new Date(); +// timeResult = computeTime.ComputeDateDifference(startDate, endDate); +// computeTime.PrintTime(timeResult); } /** * Sorts current array values alphabetically. */ - private void Sort2DArray() { + private void SortArray() { + int arrayIndex1; + int arrayIndex2; int tempArrayIndex = 0; - char[] tempArray = new char[arrayDim1 * arrayDim2]; + sortedArray = new char[arrayDim1 * arrayDim2]; // Translate values into sortable 1d-Array. for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) { for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) { - tempArray[tempArrayIndex] = charArray[arrayIndex1][arrayIndex2]; + sortedArray[tempArrayIndex] = unsortedArray[arrayIndex1][arrayIndex2]; tempArrayIndex++; } } - // Sort 1D-Array. - Arrays.sort(tempArray); - - // Translate values back into 2d-Array - tempArrayIndex = 0; - for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) { - for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) { - charArray[arrayIndex1][arrayIndex2] = tempArray[tempArrayIndex]; - tempArrayIndex++; - } - } + // Sort 1d-Array. + Arrays.sort(sortedArray); } @@ -127,8 +152,8 @@ public class Controller { * Iterate through each char in name and search for value in array. * @param name Name to search through. */ - private void SearchName(String name) { - int stringLength = name.length();; + private void SearchNameUnsorted(String name) { + int stringLength = name.length(); int index = 0; char tempChar; @@ -141,6 +166,26 @@ public class Controller { } + /** + * Iterate through each char in name and search for value in array. + * @param name Name to search through. + */ + private void SearchNameSorted(String name) { + int stringLength = name.length(); + int index = 0; + int returnIndex; + char tempChar; + + while (index < stringLength) { + tempChar = name.charAt(index); + returnIndex = BinarySearch(tempChar, 0, ((arrayDim1 * arrayDim2) - 1)); + index++; + // Send found values or -1 if not found. + PrintArraySearch(tempChar, returnIndex); + } + } + + /** * Linearly search through array for given value. * @param searchValue Char to search for. @@ -148,15 +193,19 @@ public class Controller { private void LinearSearch(char searchValue) { int index1 = -1; int index2 = -1; - arrayIndex1 = 0; + int arrayIndex1 = 0; + int arrayIndex2; // Search through Array until value found or end of array. while (arrayIndex1 < arrayDim1) { arrayIndex2 = 0; while (arrayIndex2 < arrayDim2) { - if (charArray[arrayIndex1][arrayIndex2] == searchValue) { + if (unsortedArray[arrayIndex1][arrayIndex2] == searchValue) { + + // Save found values. index1 = arrayIndex1; index2 = arrayIndex2; + // Set vars to exit loops. arrayIndex1 = arrayDim1; arrayIndex2 = arrayDim2; } @@ -169,8 +218,46 @@ public class Controller { } - private void BinarySearch() { + /** + * Binary search through array for given value. + * @param searchValue Char to search for + */ + private int BinarySearch(char searchValue, int firstIndex, int lastIndex) { + + // Check if first index is after last index. + if (firstIndex >= lastIndex) { + // End of search. + if (sortedArray[firstIndex] == searchValue) { + // Match found. + return firstIndex; + } else { + // No match found. + return -1; + } + + } else { + + // More potential values. + int middleIndex = (firstIndex + lastIndex) / 2; + if (sortedArray[middleIndex] == searchValue) { + + // Match found. + return middleIndex; + } else { + + // No match found. + if (sortedArray[middleIndex] > searchValue) { + // Search value is earlier than current. + // Searching first half of values. + return BinarySearch(searchValue, firstIndex, middleIndex); + } else { + // Search value is later than current. + // Searching second half of values. + return BinarySearch(searchValue, (middleIndex + 1), lastIndex); + } + } + } } //endregion Array Management Methods @@ -216,29 +303,30 @@ public class Controller { * Sets dimensions of 2d-Array. */ private void GetArrayDimensions() { - tempString = GetUserInput("Enter first array length: "); + String userInputString = GetUserInput("Enter first array length: "); try { - arrayDim1 = Integer.parseInt(tempString); + arrayDim1 = Integer.parseInt(userInputString); } catch (Exception e) { System.out.println("Invalid int value."); } - tempString = GetUserInput("Enter second array length: "); + userInputString = GetUserInput("Enter second array length: "); try { - arrayDim2 = Integer.parseInt(tempString); + arrayDim2 = Integer.parseInt(userInputString); } catch (Exception e) { System.out.println("Invalid int value."); } - System.out.println(); } /** - * Prints current array values. + * Prints current unsorted array values. */ - private void Print2DArray() { + private void PrintUnsortedArray() { + System.out.println("Unsorted Array:"); + for (int index1 = 0; index1 < arrayDim1; index1++) { for (int index2 = 0; index2 < arrayDim2; index2++) { - System.out.print(charArray[index1][index2] + " ") ; + System.out.print(unsortedArray[index1][index2] + " "); } System.out.println(); } @@ -246,11 +334,52 @@ public class Controller { } + /** + * Prints current sorted array values. + */ + private void PrintSortedArray() { + System.out.println("Sorted Array:"); + int index = 0; + for (int index1 = 0; index1 < arrayDim1; index1++) { + for (int index2 = 0; index2 < arrayDim2; index2++) { + System.out.print(sortedArray[index] + " "); + index++; + } + System.out.println(); + } + System.out.println(); + } + + + /** + * Print out search values for unsorted array. + * @param searchValue Char to search for. + * @param index1 Row char was found in. + * @param index2 Col char was found in. + */ private void PrintArraySearch(char searchValue, int index1, int index2) { System.out.println(searchValue + ":[" + index1 + "," + index2 + "]"); } + + /** + * Print out search values for sorted array. + * @param searchValue Char to search for. + * @param index Index char was found in. + */ + private void PrintArraySearch(char searchValue, int index) { + if (index > -1) { + // Item found. + int index1 = index / arrayDim1; + int index2 = index % arrayDim1; + System.out.println(searchValue + ":[" + index1 + "," + index2 + "]"); + } else { + // Item not found. + System.out.println(searchValue + ":[" + index + "," + index + "]"); + } + } + //endregion User Interface Methods //endregion Methods diff --git a/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java b/a0/src/com/CS3310/a0/tests/ComputeTimeTests.java similarity index 99% rename from a0/src/com/CS3310/a0/tests/ComputeTimeTest.java rename to a0/src/com/CS3310/a0/tests/ComputeTimeTests.java index f3f18d5..76bb965 100644 --- a/a0/src/com/CS3310/a0/tests/ComputeTimeTest.java +++ b/a0/src/com/CS3310/a0/tests/ComputeTimeTests.java @@ -8,7 +8,7 @@ import org.junit.Test; import com.CS3310.a0.ComputeTime; -public class ComputeTimeTest { +public class ComputeTimeTests { //region Variables -- GitLab