通过我的方法错误对数组进行排序 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 有更多的字符,所以当你开始逐字符比较时a 到 b,是索引超出 b 大小的给定点,然后你得到例外
您的问题行是:if (!(b.equals(a.substring(i, b.length() + i))))
为什么?
让我们假设您的 a.length()
等于 6
并且 b.length()
等于 2
现在您的循环 for (int i = 0; i < a.length(); i++)
和 i
从 0 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;
}
}
}
我是编程新手,需要一些帮助。我应该用自己的方法检查一个数组是否有另一个数组的子序列。意思是如果第一个数组是 {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 有更多的字符,所以当你开始逐字符比较时a 到 b,是索引超出 b 大小的给定点,然后你得到例外
您的问题行是:if (!(b.equals(a.substring(i, b.length() + i))))
为什么?
让我们假设您的 a.length()
等于 6
并且 b.length()
等于 2
现在您的循环 for (int i = 0; i < a.length(); i++)
和 i
从 0 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;
}
}
}