Недавно мне было предложено написать 3 тестовые программы для работы. Они будут написаны с использованием только основного Java API и любой тестовой среды по моему выбору. Модульные тесты должны быть реализованы там, где это необходимо.
Хотя я и не получил никакой обратной связи, я полагаю, что им не нравились мои решения (в противном случае я бы слышал от них), поэтому я решил показать здесь свои программы и спросить, можно ли считать эту реализацию хорошей, а если нет, то почему?
Чтобы избежать путаницы, я попрошу только первый на данный момент.
Внедрить функцию, которая находит массив в другом более крупном массиве. Это должен принимать два массива в качестве параметров и он вернет индекс первый массив, где второй массив сначала происходит в полном объеме. Например, findArray ([2,3,7,1,20], [7,1]) следует return 2.
Я не пытался найти какое-либо существующее решение, но вместо этого хотел сделать это сам.
Возможные причины: 1. Должен быть статичным. 2. Следует использовать комментарии строк вместо блочных. 3. Сначала не проверял нулевые значения (я знаю, просто заметил слишком поздно). 4.?
UPDATE:
Было представлено несколько причин, и мне очень сложно выбрать один ответ, так как многие ответы имеют хорошее решение. Как упоминал @adietrich, я склонен полагать, что они хотели, чтобы я продемонстрировал знание основного API (они даже попросили написать функцию, а не писать алгоритм).
Я считаю, что лучший способ обеспечить работу - предоставить как можно больше решений, в том числе: 1. Внедрение с использованием метода Collections.indexOfSubList(), чтобы показать, что я знаю API основных коллекций. 2. Реализуйте с использованием подхода грубой силы, но обеспечите более элегантное решение. 3. Реализуйте использование алгоритма поиска, например Boyer-Moore. 4. Реализуйте использование комбинации System.arraycopy() и Arrays.equal(). Однако это не лучшее решение с точки зрения производительности, это покажет мои знания стандартных процедур массива.
Спасибо всем за ваши ответы!
КОНЕЦ ОБНОВЛЕНИЯ.
Вот что я написал:
Фактическая программа:
package com.example.common.utils;
/**
* This class contains functions for array manipulations.
*
* @author Roman
*
*/
public class ArrayUtils {
/**
* Finds a sub array in a large array
*
* @param largeArray
* @param subArray
* @return index of sub array
*/
public int findArray(int[] largeArray, int[] subArray) {
/* If any of the arrays is empty then not found */
if (largeArray.length == 0 || subArray.length == 0) {
return -1;
}
/* If subarray is larger than large array then not found */
if (subArray.length > largeArray.length) {
return -1;
}
for (int i = 0; i < largeArray.length; i++) {
/* Check if the next element of large array is the same as the first element of subarray */
if (largeArray[i] == subArray[0]) {
boolean subArrayFound = true;
for (int j = 0; j < subArray.length; j++) {
/* If outside of large array or elements not equal then leave the loop */
if (largeArray.length <= i+j || subArray[j] != largeArray[i+j]) {
subArrayFound = false;
break;
}
}
/* Sub array found - return its index */
if (subArrayFound) {
return i;
}
}
}
/* Return default value */
return -1;
}
}
Тестовый код:
package com.example.common.utils;
import com.example.common.utils.ArrayUtils;
import junit.framework.TestCase;
public class ArrayUtilsTest extends TestCase {
private ArrayUtils arrayUtils = new ArrayUtils();
public void testFindArrayDoesntExist() {
int[] largeArray = {1,2,3,4,5,6,7};
int[] subArray = {8,9,10};
int expected = -1;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArrayExistSimple() {
int[] largeArray = {1,2,3,4,5,6,7};
int[] subArray = {3,4,5};
int expected = 2;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArrayExistFirstPosition() {
int[] largeArray = {1,2,3,4,5,6,7};
int[] subArray = {1,2,3};
int expected = 0;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArrayExistLastPosition() {
int[] largeArray = {1,2,3,4,5,6,7};
int[] subArray = {5,6,7};
int expected = 4;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArrayDoesntExistPartiallyEqual() {
int[] largeArray = {1,2,3,4,5,6,7};
int[] subArray = {6,7,8};
int expected = -1;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArrayExistPartiallyEqual() {
int[] largeArray = {1,2,3,1,2,3,4,5,6,7};
int[] subArray = {1,2,3,4};
int expected = 3;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArraySubArrayEmpty() {
int[] largeArray = {1,2,3,4,5,6,7};
int[] subArray = {};
int expected = -1;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArraySubArrayLargerThanArray() {
int[] largeArray = {1,2,3,4,5,6,7};
int[] subArray = {4,5,6,7,8,9,10,11};
int expected = -1;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
public void testFindArrayExistsVeryComplex() {
int[] largeArray = {1234, 56, -345, 789, 23456, 6745};
int[] subArray = {56, -345, 789};
int expected = 1;
int actual = arrayUtils.findArray(largeArray, subArray);
assertEquals(expected, actual);
}
}