Мне нужна помощь в переименовании элемента в массиве - PullRequest
0 голосов
/ 21 ноября 2018

Я делаю java-проект в школе, и у нас была следующая проблема:

переименовать - изменяет имя существующего листа

public int rename(String currentName, String newName)

rename передается два имени листа.Переименование должно выполняться только в том случае, если имя листа currentName присутствует в списке, а имя листа newName отсутствует.В противном случае rename ничего не делает (т. Е. Список не изменяется).Если currentName успешно изменено на newName, то метод возвращает позицию индекса листа, переименованного.В противном случае он возвращает -1.

Это то, что у меня есть до сих пор

public int rename(String currentName, String newName) {
    int i = 0;
    for (i=0; i<SheetsNames.length; i++) {
        if (SheetsNames[i].equals(currentName)) {
            SheetsNames[i] = newName;
                return i;
        }
    }
    return -1;
}

Я получил часть переименования, но не могу заставить ее не переименовывать как-тос таким же именем

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

Прочитайте комментарии в коде ниже:

public int rename(String currentName, String newName) {
    int currentNameindex = -1; // set the initial position of currentName

    for (int i = 0; i < SheetsNames.length; i++) {
        if (currentNameindex < 0)  // currentName has not been found yet 
            if (SheetsNames[i].equals(currentName))
                currentNameindex = i;  // save the position of currentName 

        if (SheetsNames[i].equals(newName))  // newName is found in the list
            return -1;  
    }

    if (currentNameindex > 0)  // currentName is found in the list
        SheetsNames[currentNameindex] = newName;  // rename the list item

    return currentNameindex;
}
0 голосов
/ 22 ноября 2018

Перебирайте SheetNames и сохраняйте любые экземпляры индекса currentName в переменной с именем index, одновременно проверяя, присутствует ли newName в списке.Если есть экземпляр newName, автоматически возвращается -1.Но если в списке нет newName, экземпляр индекса currentName будет сохранен в переменной index, если он присутствует.Если их нет, функция возвращает -1 в любом случае, потому что это то, с чем инициализируется индекс.

public int rename(String currentName, String newName) {
    int index = -1;
    for (int i=0; i<SheetsNames.length; i++) {
        if (SheetsNames[i].equals(newName))
            return -1;
        if (SheetsNames[i].equals(currentName))
            index = i;
    }
    if (index != -1)
        SheetNames[index] = newName;
    return index; 
}
0 голосов
/ 22 ноября 2018

Вот решение.

1) Проверены входные параметры

2) Ищет строку в массиве и возвращает индекс

public class SheetNames {

    public Integer changeSheetName(String[] sheetNames, String currentName, String newName) {

        if (sheetNames == null || sheetNames.length == 0 || currentName == null || newName == null) {
            throw new IllegalArgumentException("Invalid input");
        }

        Integer replacedIndex = Arrays.asList(sheetNames).indexOf(currentName);
        if (replacedIndex != -1) {
            sheetNames[replacedIndex] = newName;
        }
        System.out.println(Arrays.toString(sheetNames));
        return replacedIndex;
    }
}

JunitТесты: -

public class SheetNamesTest {

    private SheetNames sheetNames;

    @Before
    public void setup() {
        sheetNames = new SheetNames();
    }

    @Test
    public void shouldReplaceSheetName() {
        String[] sheetNamesArr = {"dennis", "john", "dan"};
        Assert.assertEquals(new Integer(1), sheetNames.changeSheetName(sheetNamesArr, "john", "peter"));

        String[] sheetNamesArr2 = {"john", "dan"};
        Assert.assertEquals(new Integer(0), sheetNames.changeSheetName(sheetNamesArr2, "john", "peter"));
    }

    @Test
    public void shouldNotReplaceSheetName() {
        String[] sheetNamesArr = {"dennis", "johnhunt", "dan"};
        Assert.assertEquals(new Integer(-1), sheetNames.changeSheetName(sheetNamesArr, "john", "peter"));
    }

    @Test(expected = IllegalArgumentException.class)
    public void shouldThrowExceptionWhenSheetNameIsNull() {
        sheetNames.changeSheetName(null, "john", "peter");
    }

    @Test(expected = IllegalArgumentException.class)
    public void shouldThrowExceptionWhenSheetNameIsEmpty() {
        String[] sheetNamesArr = {};
        sheetNames.changeSheetName(sheetNamesArr, "john", "peter");
    }

    @Test(expected = IllegalArgumentException.class)
    public void shouldThrowExceptionWhenCurrentNameIsNull() {
        String[] sheetNamesArr = {"dennis", "johnhunt", "dan"};
        sheetNames.changeSheetName(sheetNamesArr, null, "peter");
    }

    @Test(expected = IllegalArgumentException.class)
    public void shouldThrowExceptionWhenNewNameIsNull() {
        String[] sheetNamesArr = {"dennis", "johnhunt", "dan"};
        sheetNames.changeSheetName(sheetNamesArr, "john", null);
    }

}
0 голосов
/ 21 ноября 2018

Просмотрите ваши SheetsNames и проверьте, содержит ли оно уже newName (если да, то вы не хотите обновлять, так что верните -1)

for(String name: SheetsNames){
   if(name.equals(newName) return -1;
}

Теперь мы уверены, что нового имени нет в списке!Давайте проверим, есть ли там имя, совпадающее с currentName, если да, вернем его индекс.

for(int i=0;i<SheetsNames.length;i++){

   if(name.equals(currentName){
     SheetsNames[i] = newName;
     return i;
   }
}
return -1; //its not in SheetsNames, so we return -1
...