From d58e10c31a3aa2a33e06c750a562257f1ec0dc06 Mon Sep 17 00:00:00 2001 From: Brandon Rodriguez <brodriguez8774@gmail.com> Date: Wed, 27 Sep 2017 16:47:39 -0400 Subject: [PATCH] Update searches to account for duplicate characters --- a0/src/com/CS3310/a0/Controller.java | 154 ++++++++++++++++++++++++--- 1 file changed, 140 insertions(+), 14 deletions(-) diff --git a/a0/src/com/CS3310/a0/Controller.java b/a0/src/com/CS3310/a0/Controller.java index 7a8f435..81e5d34 100644 --- a/a0/src/com/CS3310/a0/Controller.java +++ b/a0/src/com/CS3310/a0/Controller.java @@ -16,7 +16,9 @@ public class Controller { private int arrayDim1; private int arrayDim2; private char[][] unsortedArray; + private char [][] unsortedFoundHolder; private char[] sortedArray; + private char[] sortedFoundHolder; private Random random = new Random(); private Scanner reader = new Scanner(System.in); private ComputeTime computeTime = new ComputeTime(); @@ -132,14 +134,14 @@ public class Controller { private void SortArray() { int arrayIndex1; int arrayIndex2; - int tempArrayIndex = 0; + int index = 0; sortedArray = new char[arrayDim1 * arrayDim2]; // Translate values into sortable 1d-Array. for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) { for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) { - sortedArray[tempArrayIndex] = unsortedArray[arrayIndex1][arrayIndex2]; - tempArrayIndex++; + sortedArray[index] = unsortedArray[arrayIndex1][arrayIndex2]; + index++; } } @@ -155,8 +157,19 @@ public class Controller { private void SearchNameUnsorted(String name) { int stringLength = name.length(); int index = 0; + int arrayIndex1; + int arrayIndex2; char tempChar; + unsortedFoundHolder = new char[arrayDim1][arrayDim2]; + + // Create array to hold found values. + for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) { + for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) { + unsortedFoundHolder[arrayIndex1][arrayIndex2] = 'o'; + } + } + // Search current string values. while (index < stringLength) { tempChar = name.charAt(index); LinearSearch(tempChar); @@ -173,9 +186,22 @@ public class Controller { private void SearchNameSorted(String name) { int stringLength = name.length(); int index = 0; + int arrayIndex1; + int arrayIndex2; int returnIndex; char tempChar; + sortedFoundHolder = new char[(arrayDim1 * arrayDim2)]; + + // Create array to hold found values. + for (arrayIndex1 = 0; arrayIndex1 < arrayDim1; arrayIndex1++) { + for (arrayIndex2 = 0; arrayIndex2 < arrayDim2; arrayIndex2++) { + sortedFoundHolder[index] = 'o'; + index++; + } + } + // Search current string values. + index = 0; while (index < stringLength) { tempChar = name.charAt(index); returnIndex = BinarySearch(tempChar, 0, ((arrayDim1 * arrayDim2) - 1)); @@ -202,12 +228,18 @@ public class Controller { while (arrayIndex2 < arrayDim2) { if (unsortedArray[arrayIndex1][arrayIndex2] == searchValue) { - // Save found values. - index1 = arrayIndex1; - index2 = arrayIndex2; - // Set vars to exit loops. - arrayIndex1 = arrayDim1; - arrayIndex2 = arrayDim2; + // Match found. Check that value is unique. + if (unsortedFoundHolder[arrayIndex1][arrayIndex2] == 'o') { + // Hold value of index. + unsortedFoundHolder[arrayIndex1][arrayIndex2] = 'x'; + // Save found values. + index1 = arrayIndex1; + index2 = arrayIndex2; + // Set vars to exit loops. + arrayIndex1 = arrayDim1; + arrayIndex2 = arrayDim2; + } + } arrayIndex2++; } @@ -220,16 +252,26 @@ public class Controller { /** * Binary search through array for given value. - * @param searchValue Char to search for + * @param searchValue Char to search for. */ private int BinarySearch(char searchValue, int firstIndex, int lastIndex) { + int tempInt; // Check if first index is after last index. if (firstIndex >= lastIndex) { + // End of search. if (sortedArray[firstIndex] == searchValue) { - // Match found. - return firstIndex; + // Match found. Check that value is unique. + + if (sortedFoundHolder[firstIndex] == 'o') { + // Valid value. Return index. + sortedFoundHolder[firstIndex] = 'x'; + return firstIndex; + } else { + // Duplicate value. Return -1. + return -1; + } } else { // No match found. return -1; @@ -241,8 +283,28 @@ public class Controller { int middleIndex = (firstIndex + lastIndex) / 2; if (sortedArray[middleIndex] == searchValue) { - // Match found. - return middleIndex; + // Match found. Check that value is unique. + if (sortedFoundHolder[middleIndex] == 'o') { + sortedFoundHolder[middleIndex] = 'x'; + return middleIndex; + } else { + + // First try checking values directly left. + tempInt = BinaryCheckOneLeft(searchValue, middleIndex); + if (tempInt != (-1)) { + return tempInt; + } else { + // No match found. Attempting values directly right. + tempInt = BinaryCheckOneRight(searchValue, middleIndex); + if (tempInt != (-1)) { + return tempInt; + } else { + // No possible matches. + return -1; + } + } + + } } else { @@ -257,7 +319,71 @@ public class Controller { return BinarySearch(searchValue, (middleIndex + 1), lastIndex); } } + + } + } + + + /** + * Desired char was found but value was already "used". + * Check values directly left for "unused" match. + * @param searchValue Char to search for. + * @param index Index that was "used". + * @return Valid match or -1. + */ + private int BinaryCheckOneLeft(char searchValue, int index) { + + try { + // First check if value one left is same character. + if (sortedArray[index - 1] == searchValue) { + // Match found. Check if spot is unique. + if (sortedFoundHolder[index - 1] == 'o') { + sortedFoundHolder[index - 1] = 'x'; + return (index - 1); + } else { + // Next value was already found. Check left again. + return BinaryCheckOneLeft(searchValue, (index - 1)); + } + } else { + return -1; + } + } catch(Exception e) { + // Handling if index is out of bounds. + // Obviously no match in this instance. + return -1; + } + } + + + /** + * Desired char was found but value is already "used". + * Check values directly right for "unused" match. + * @param searchValue Char to serach for. + * @param index Index that was "used". + * @return Valid match or -1; + */ + private int BinaryCheckOneRight(char searchValue, int index) { + + try { + // First check if value one right is same character. + if (sortedArray[index + 1] == searchValue) { + // Match found. Check if spot is unique. + if (sortedFoundHolder[index + 1] == 'o') { + sortedFoundHolder[index + 1] = 'x'; + return (index + 1); + } else { + // Next value was already found. Check right again. + return BinaryCheckOneRight(searchValue, (index + 1)); + } + } else { + return -1; + } + } catch(Exception e) { + // Handling if index is out of bounds. + // Obviously no match in this instance. + return -1; } + } //endregion Array Management Methods -- GitLab