2016-11-25 2 views
1

Я новичок в программировании, и мне нужна помощь. Я должен сделать свой собственный метод проверки, если один массив имеет подпоследовательность к другому. Значение, если первый массив равен {1, 2, 3, 4, 5}, а второй - {1, 2, 3}, второй - подпоследовательность первого. Однако если первый из них {1, 2, 3, 4, 5}, а второй - {1, 4, 5}, это не подпоследовательность, поэтому вторая должна быть также в порядке.Сортировка массива с помощью ошибки метода Java

Я попытался сделать это таким образом через строки:

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 ошибки, вот PrintScreen:

enter image description here

А вот как я Тестирование метод:

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

Я знаю, что, возможно, от ошибок, поэтому поразил меня этим.

+0

Пожалуйста, пост ошибки в вопросе, нет внешняя ссылка. Вы перешли код в отладчике? Исключение совершенно очевидно, вы превышаете границы строкового индекса. Таким образом, «b.length() + i», скорее всего, проблема. – OldProgrammer

+0

Почему вы не сравниваете целые массивы напрямую, а не конвертируете их в строки? – thatguy

+0

Потому что я сосать в массивах, и это была просто интересная идея, поэтому я попробовал. – Sevajper

ответ

0

Здесь:

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

Ваше внешнее условие цикла убеждается, что я остается меньше a.length(). Но тогда вы пытаетесь взять подстроку внутри той, которая идет для b.length() + i!

Другими словами: для любого b.length()> 0 ... этот код будет всегда пытаются принести символов за конца.

И есть также ошибка в обработке результата - кажется, очень возможно, что вы назначаете

c = true; 

в какой-то момент; позже перезаписать, что с

c = false; 

Другими словами: ваш код забывает, что он нашел матч! Намного проще: при ударе по истинному случаю просто верните истину! И если вы не вернетесь в цикле; вы просто возвращаете false в конце.

И наконец: хотя кажется, что это крутая идея превратить ваши массивы в строки ..., которые на самом деле ничего не покупают. Вы по-прежнему выполняете работу над первым массивом и проверяете, есть ли там вторая. Написание кода, который делает это напрямую на предоставленных массивах ... не сильно отличался бы от того, что вы получили там с помощью своего «струнного обхода».

Редактировать: при использовании нескольких возвратов в методе вам просто нужно убедиться, что любой Возможный путь имеет оператор возврата.В вашем случае:

boolean subs(... { 

    if equal strings 
    return true 

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

    return false 
+0

Спасибо за ваш ответ! Я понял, что проблема была в том, что я сделал это со строками, потому что я, по крайней мере, сосать массивы. Я не совсем понял, как нажать return после истинного случая, так как истинный случай находится в цикле, и метод не распознает возврат. – Sevajper

+0

Благодарим за быстрое принятие. Я обновил ответ с помощью некоторого псевдокода, чтобы показать вам, как многократные возвраты могут работать. Ключевым моментом является следующее: это возможно только тогда, когда все пути через этот метод содержат оператор return. Я думаю, * метод не распознает return *, переводит: ваш код пропускает какой-то другой возврат в другом месте! – GhostCat

+0

После некоторой борьбы я понял это спасибо. Кстати, я не знал, что все пути должны иметь возвращаемые утверждения, чтобы они работали, поэтому я узнал что-то новое сегодня. Еще раз спасибо :) – Sevajper

0

Вопрос заключается в том, что fArray, как строка имеет больше символов, чем tempArray в виде строки, поэтому когда вы начинаете сравнивать полукокса с помощью полукокса из к б, является данная точка, где индекс выходит за пределы размера б и тогда вы получите за исключением

+0

Но поскольку я ставлю tempArray в тесте на {2, 3, 4}, я думал, что он найдет его истинным, а затем сломает цикл и завершит этот метод. – Sevajper

0

Ваша проблема заключается в следующем: 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. Теперь, когда вы звоните a.substring(4, b.length() + 4) с b.length() == 2 =>a.substring(4, 6) но ваша строка идет только из 0 to 5

0

Самый простой способ сделать это было бы использовать 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; 
} 
0
//******************************************************************* 
// 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; 
    } 
    } 
} 
+0

это хорошо протестированное решение проблемы. –

Смежные вопросы