通过我的方法错误对数组进行排序 Java

Sorting an array through my method error Java

我是编程新手,需要一些帮助。我应该用自己的方法检查一个数组是否有另一个数组的子序列。意思是如果第一个数组是 {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));

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

这里:

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

您的外循环条件确保 i 保持小于 a.length()。 但是随后您尝试在 b.length()+i!

中取一个子字符串

换句话说:对于任何 b.length() > 0 ...该代码将 总是 尝试获取字符 beyond a.

结束

而且您的结果处理中也存在错误 - 您似乎很有可能分配

c = true;

在某个时候;稍后

覆盖
c = false;

换句话说:您的代码忘记了他找到了匹配项!更简单的解决方案:当遇到真实情况时,那里只有 return 真!如果你不在循环中 return ;你最后只是 return false.

最后:虽然将数组转换为字符串似乎是个很酷的主意……但这并不能真正给您带来任何好处。您仍在执行遍历第一个数组并检查第二个数组是否在其中的工作。在提供的数组上直接 编写代码...与您使用 "string detour".

获得的代码没有太大区别

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

boolean subs(... {

   if equal strings
     return true

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

   return false

问题是 fArray as String 比 tempArray as string 有更多的字符,所以当你开始逐字符比较时ab,是索引超出 b 大小的给定点,然后你得到例外

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

为什么?

让我们假设您的 a.length() 等于 6 并且 b.length() 等于 2 现在您的循环 for (int i = 0; i < a.length(); i++)i0 to 5.

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

最简单的方法是使用 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;
}
//*******************************************************************
// 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;
    }
    }
}