【问题标题】:I need help renaming an element in an array我需要帮助重命名数组中的元素
【发布时间】:2019-04-24 11:49:26
【问题描述】:

我在学校做一个 java 项目,我们遇到了以下问题:

rename – 更改现有工作表的名称

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;
}

我得到了重命名部分,但我无法让它不重命名为具有相同名称的东西

【问题讨论】:

  • 是什么让你认为如果currentName 不在Array 中,它仍然会做一些事情?您是否使用未包含的元素对其进行了测试并且它更改了元素?如果是这样,请edit您的帖子包含此场景
  • if (newName.equals(currentName) { return -1; } ?在一个很小的“家庭作业案例”中,这并没有增加很多。
  • 什么是SheetsNames?据我所知,从语法亮点和普通变量以小写开头的事实来看,我假设您访问的是类型定义而不是变量。
  • “但我不能让它不将其重命名为具有相同名称的东西”您如何一方面执行正确的布尔评估,另一方面另一方面找不到如何执行 99% 相似的布尔评估?
  • SheetNames 是一个列表还是一个数组,你提到两者?

标签: java arrays rename


【解决方案1】:

这是解决方案。

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);
    }

}

【讨论】:

    【解决方案2】:

    阅读下面代码中的cmets:

    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;
    }
    

    【讨论】:

      【解决方案3】:

      遍历 SheetNames 并将 currentName 索引的任何实例存储在名为 index 的变量中,同时检查 newName 是否存在于列表中。如果有 newName 的实例自动返回 -1。但是,如果列表中没有 newName,则 currentName 的索引实例将存储在索引变量中(如果存在)。如果没有,则该函数无论如何都会返回 -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; 
      }
      

      【讨论】:

        【解决方案4】:

        遍历您的 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
        

        【讨论】:

        • 进行检查的唯一要点是避免循环遍历所有成员。
        猜你喜欢
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多