【问题标题】:Sorting an array through my method error Java通过我的方法错误Java对数组进行排序
【发布时间】:2016-11-25 19:14:24
【问题描述】:

我是编程新手,需要一些帮助。我应该用自己的方法检查一个数组是否有另一个数组的子序列。这意味着如果第一个数组是 {1, 2, 3, 4, 5},第二个是 {1, 2, 3},那么第二个是第一个的子序列。但是,如果第一个是 {1, 2, 3, 4, 5} 而第二个是 {1, 4, 5} 它不是子序列,所以第二个也必须按顺序排列。

我曾尝试通过字符串来做到这一点:

private static boolean subs(int[] array, int[] subsequence) {
    String a = Arrays.toString(array);
    String b = Arrays.toString(subsequence);
    boolean c = false;

    if (a.equals(b)) {
        return true;
    }

    for (int i = 0; i < a.length(); i++) {
        if (!(b.equals(a.substring(i, b.length() + i)))) {
            c = false;
        } else {
            c = true;
            break;
        }
    }
    if (c == true) {
        return true;
    } else {
        return false;
    }
}

但是我得到 3 个错误,这里是打印屏幕:

这是我测试该方法的方式:

    int[] fArray = { 1, 2, 3, 4, 5 };
    int[] tempArray = { 2, 3, 4 };
    System.out.println(subs(fArray, tempArray));

我知道我可能犯了很多错误,所以用它来打击我。

【问题讨论】:

  • 请发布有问题的错误,没有外部链接。您是否在调试器中单步执行了代码?异常很明显,您超出了字符串索引的范围。所以,“b.length() + i”很可能是问题所在。
  • 为什么不直接比较整数数组,而不是将它们转换成字符串呢?
  • 因为我不擅长数组,而且这只是一个有趣的想法,所以我尝试了。

标签: java arrays string runtime-error subsequence


【解决方案1】:

这里:

for (int i = 0; i < a.length(); i++) {
  if (!(b.equals(a.substring(i, b.length() + i)))) {

您的外部循环条件确保 i 保持小于 a.length()。 但是然后你尝试在 a 中取一个用于 b.length()+i! 的子字符串!

换句话说:对于任何 b.length() > 0 ...,该代码将总是尝试获取 超出 a 结尾的字符。

您的结果处理中也有一个错误 - 您分配似乎很有可能

c = true;

在某个时候;以后用

覆盖
c = false;

换句话说:你的代码忘记他找到了一个匹配!更简单的解决方案:当遇到真实情况时,只需在此处返回 true !如果你不在循环内返回;你最后只返回false。

最后:虽然将数组转换为字符串似乎是一个很酷的主意……但这并不能真正为您带来任何好处。您仍在做检查第一个数组并检查第二个数组是否在其中的工作。在提供的数组上直接编写代码......与您通过“字符串绕道”获得的代码没有太大区别。

编辑:当在一个方法中使用多个返回时,您只需确保任何可能的路径都有一个返回语句。在你的情况下:

boolean subs(... {

   if equal strings
     return true

   for i as index in a
      if a.substring equals b
        return true

   return false

【讨论】:

  • 感谢您的回答!我明白问题出在哪里我用字符串做的原因是因为我现在至少在数组上很烂。我不太明白如何在真实案例之后点击返回,因为真实案例在循环中并且该方法无法识别返回。
  • 感谢您的快速接受。我用一些伪代码更新了答案,以向您展示多个返回如何工作。关键点是:只有当通过该方法的所有路径都包含 return 语句时才有可能。我猜 该方法无法识别返回 转换为:您的代码在另一个地方缺少一些其他返回!
  • 经过一番努力,我想通了,谢谢。顺便说一句,我不知道所有路径都必须有 return 语句才能使其工作,所以我今天学到了一些新东西。再次感谢:)
【解决方案2】:

问题是 fArray as String 比 tempArray as string 有更多的字符,所以当你开始从 a 逐个字符比较时到 b,是索引超出 b 大小的给定点,然后您会得到异常

【讨论】:

  • 但是由于我在测试中将 tempArray 设置为 {2, 3, 4} 我认为它会发现它是真的然后打破循环并完成该方法。
【解决方案3】:

你的问题是:if (!(b.equals(a.substring(i, b.length() + i))))

为什么?

假设你的a.length() 等于6b.length() 等于2 现在你的循环for (int i = 0; i &lt; a.length(); i++)i 来自0 to 5

现在假设你的循环执行了 3 次,i is equals 4now。 现在,当您使用 b.length() == 2 => a.substring(4, 6) 调用 a.substring(4, b.length() + 4) 但您的字符串仅来自 0 to 5

【讨论】:

    【解决方案4】:

    最简单的方法是使用Collections.indexOfSubList

    private static boolean subs(int[] array, int[] subsequence) {
        return Collections.indexOfSubList(toList(array), toList(subsequence)) >= 0;
    }
    
    private static List<Integer> toList(int[] array) {
        List<Integer> list = new ArrayList<>(array.length);
        for (int num : array) {
            list.add(num);
        }
        return list;
    }
    

    【讨论】:

      【解决方案5】:
      //*******************************************************************
      // NOTE: please read the 'More Info' tab to the right for shortcuts.
      //*******************************************************************
      
      import java.lang.Math; // headers MUST be above the first class
      import java.util.Arrays;
      // one class needs to have a main() method
      public class HelloWorld
      {
        // arguments are passed using the text field below this editor
        public static void main(String[] args)
        {
         int[] fArray = { 1,2,3,4,5 };
          int[] tempArray = { 2,3,4 };
          System.out.println(subs(fArray, tempArray));
        }
        private static boolean subs(int[] array, int[] subsequence) {
          String a = Arrays.toString(array);
          String b = Arrays.toString(subsequence);
          boolean c = false;
      
          if (a.equals(b)) {
              return true;
          }
          String ss = b.substring(1,b.length()-1);
          for (int i = 0; i < 8; i++) {
            String substr =a.substring(i, ss.length()+i);
              if (!(ss.equals( substr ))) {
                System.out.println("heelllo");
                  c = false;
              } else {
                  c = true;
                  break;
              }
          }
          if (c == true) {
              return true;
          } else {
              return false;
          }
          }
      }
      

      【讨论】:

      • 这是一个经过良好测试的解决方案。
      猜你喜欢
      • 2019-09-07
      • 2020-01-15
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多