логический метод для проверки, может ли строка быть проанализирована как int - PullRequest
0 голосов
/ 06 февраля 2019

Обратите внимание, что перед тем, как вы отметите мой вопрос как дубликат, я ссылаюсь на этот вопрос: Как лучше всего проверить, представляет ли строка целое число в Java?

Я пытаюсьпроверять графовые объекты, которые приходят из графового класса, представляющего матрицы смежности.

Я использую расширенный цикл for для итерации по каждому узлу в графе, а затем использую вложенный расширенный цикл for, чтобы затем выполнять итерацию по каждому соединительному ребру от каждого узла к каждому другому узлу.

Дело в том, что я имею дело с некоторыми графами, которые имеют только целочисленные ребра, и некоторыми графами, которые имеют нецелочисленные ребра.

Итак, мне нужно написать метод или серию методов, которые могут проверить, чтобы увидеть, содержит ли каждое ребро в графическом объекте строки, которые можно анализировать как целые числа или нет.

Мой код очень прост и прост, но при использовании примеров графиков, которые должны возвращать false, я получаю только истинное возвращаемое значение.

Мой код выглядит следующим образом:

//method to determine if a string can be parsed as an integer greater than zero

public boolean isInteger(String str)
{
    try
    {   //if the string can be parsed as an int that's greater than zero...
        Integer.parseInt(str);
            return true;
    }
    catch(Exception e)
    {
        return false;
    }
}

//method to traverse all edges in a graph object to identify whether or not all 
//edges can be parsed as positive integers representing distances 
public void checkParsability()
{
    //while positive int edges is true and therefore all edges can be parsed as positive integers
    if (positive_int_edges)

    {
        for (Node n : this.nodeList)
        {
            for (Edge a : n.getOutgoingEdges())
                this.setPositive_int_edges(isInteger(a.getLabel()));
                //positive_int_edges = isInteger(a.getLabel());

            for (Edge a : n.getIncomingEdges())
                this.setPositive_int_edges(isInteger(a.getLabel()));
                //positive_int_edges = isInteger(a.getLabel());
        }
    }
    //return positive_int_edges;
}


public boolean isPositive_int_edges() {
    return positive_int_edges;
}

public void setPositive_int_edges(boolean positive_int_edges) {
    this.positive_int_edges = positive_int_edges;
}

График матрицы смежности выглядит примерно так:

~          val  AAA   BB    C  DDD    E
Alfa         S    ~    >    ~   99  fig
Bravo       67  999  -42    3    x   ==
Charlie      ~    ~    4    ~   yz    9
Delta       4e    3   22    x    ~  !=2
Echo       yes    ~    ~    ~  d>e   33

это должно возвращать false, но по какой-то причине это всегдавозвращая истину.Любая помощь будет очень цениться.спасибо

Редактировать: positive_int_edges - это логический атрибут объектов моего графа, который я установил в true по умолчанию.Я надеюсь пройти через ряд ребер до тех пор, пока не будет найден первый экземпляр, в котором строка не может быть проанализирована как int, после того, как найден первый экземпляр, я хочу прекратить поиск, так как мне больше не нужно беспокоиться о состоянии оставшихсякрая, которые еще не были пройдены.

Edit # 2 Вот как я пытаюсь вызвать мои методы в своем классе драйверов:

System.out.println("\nthe parsability of graph g after call to parsability method is: \n");



g.checkParsability();

System.out.println(g.isPositive_int_edges());

1 Ответ

0 голосов
/ 06 февраля 2019

Прежде всего: если вас не интересует фактическое числовое значение, может быть проще использовать регулярные выражения:

final static Pattern IsIntegerPattern = Pattern.compile("^\\d+$");

public boolean isInteger(String str) {
    return IsIntegerPattern.matcher(str).matches();
}

Это позволяет избежать возникновения и перехвата ненужных исключений.

О том, что результат true все время: На самом деле это не так.Он вернет false, если последнее входящее ребро не является числом, потому что вы перебираете все ребра и проверяете, являются ли они целыми числами, но не прерываете цикл, если вы достигаете ребра с нецелым значением.Последующие ребра с допустимыми целочисленными значениями «перезапишут» эту информацию.

Таким образом, ваша реализация должна выглядеть следующим образом:

public void checkParsability()
{
    //while positive int edges is true and therefore all edges can be parsed as positive integers
    if (positive_int_edges)

    {
        for (Node n : this.nodeList)
        {
            for (Edge a : n.getOutgoingEdges()) {
                this.setPositive_int_edges(isInteger(a.getLabel()));
                //positive_int_edges = isInteger(a.getLabel());
                break;
            ]

            for (Edge a : n.getIncomingEdges()) {
                this.setPositive_int_edges(isInteger(a.getLabel()));
                //positive_int_edges = isInteger(a.getLabel());
                break;
            }
        }
    }
    //return positive_int_edges;
}
...