【问题标题】:Java syntax issuesJava 语法问题
【发布时间】:2013-09-29 20:45:09
【问题描述】:

我正在尝试解决约瑟夫斯问题,但我不允许使用其他人的代码 sn-ps。考虑到这一点,我的代码中有 27 个错误,但不知道如何修复它。您能向我解释为什么它不会编译吗?我想看看我的逻辑是否有缺陷,但我无法测试它,因为它不会编译。任何其他提示都非常受欢迎!这是我的代码:

import java.util.*;

public class Josephus
{
    public class Link
    {
        public int num;
        public Link next;

        public Link (int d)
        {
            num = d;
            next = null;
        }
    }

    public class Main
    {

        Scanner in = new Scanner(System.in);
        System.out.println("How many players");

        int numPlayers = in.nextInt();
        Link first, last;
        first = last = new Link (1);

        for(int k=2; k<=numPlayers; k++)
        {
            last.next = new Link(k);
            last = last.next;
        }
        last.next = first;

        System.out.println("How many skips");
        int m = in.nextInt();

        for (int g=0; g<numPlayers; g++)
        {
            for (int k=0; k<=m; k++);
            {
                last = last.next;
            }
            last.next;
            last = last.next;
        }
    }
}

【问题讨论】:

  • 考虑使用带有语法高亮的 IDE..
  • 您使用的是什么 IDE?日食?
  • -1 至少没有引用前 2-3 个错误。
  • 除了明显的语法错误外,请注意:first = last = new Link (1);。这很危险。对象不像基元。 2 变量将引用相同的对象。您可能需要 2 个不同的对象...
  • 好的,我的导师要求我们使用 Jgrasp。错误是“预期的标识符”并指向括号,但现在使用“public static void Main (String[] args)”解决方案后只有4个错误首先是指向公共类和void之间的空间的相同错误静态无效主要(字符串 [] 参数)。下一个错误是无效的方法声明;需要返回类型 public class void Main (String [] args)。这个错误指向大写M。下一个错误是error: not a statement last.next;这指向上一个和下一个之间的时间段。我能修复的最后一个。

标签: java compilation josephus


【解决方案1】:

代替

public class Main

你想要

public static void main(String [] args)

【讨论】:

  • 这是一个好的开始。如果没有更清楚地了解该计划的总体目的,很难提出任何其他具体建议。分析当前实施的任何假设或解释都可能导致错误信息。
  • 该程序的目的是使用链接列表来制作一个循环列表,并在特定的时间间隔删除数字,直到只剩下一个。
【解决方案2】:

我清理了一点你的代码以便它编译,你最好使用两个类

约瑟夫斯.java

import java.util.Scanner;

public class Josephus {

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.println("How many players");

    int numPlayers = in.nextInt();
    Link first = new Link(1);
    Link last = new Link(1);

    for (int k = 2; k <= numPlayers; k++) {
        last.next = new Link(k);
        last = last.next;
    }
    last.next = first;
    first.next = last;

    System.out.println("How many skips");
    int m = in.nextInt();

    for (int g = 0; g < numPlayers; g++) {
        for (int k = 0; k <= m; k++)
        {
            last = last.next;
        }
        // last.next;
        last = last.next;
    }

    in.close();
}
}

和 Link.java

public class Link {

    public int num;
    public Link next;

    public Link(int d) {
        num = d;
        next = null;
    }
}

这会编译并接受输入,然后引发错误。我没有解决这个问题,因为我不知道你想要达到什么目的。

变化:

  1. 将 `"class main"` 更改为 `public static void main(){...)` Java 运行时会在调用此方法时查找它。
  2. 提取类 `Link` 到它自己的文件 其他解决方案是可能的,就像其他一些答案所说,您可以将其声明为静态或实例化 `Josephus`(可能还有其他一些方式)
  3. 注释掉`last.next`这一行,这实际上并没有解决任何问题,它只是消除了编译错误并允许你编译,因为我看不到你在这里试图做什么我不能想不出更好的解决方案。
  4. 没有必要编译,但我在 main 方法的末尾添加了行 `in.close();` 以释放分配的资源,如果没有此行,它将引发编译警告。
  5. 添加了 `first.next = last;` 以避免发生空指针异常。

您现在需要做的就是在嵌套循环中实现 Josephus 逻辑并输出结果(如果需要),所有这些都应该与语言无关。

【讨论】:

  • 该程序的目的是使用链接列表来制作一个循环列表,并在特定的时间间隔删除数字,直到只剩下一个。感谢您使用我的代码,我不想打扰,但您能解释一下为什么这些更改会解决问题吗?
  • 像其他一些用户建议的那样,对您来说最简单的事情可能是将代码粘贴到编辑器中,我建议使用 Eclipse。 IDE 将突出显示代码中的错误并为您提供大部分错误的解释。有些东西我会添加一个解释一些修改的编辑。
【解决方案3】:

您的代码的另一个问题是您有一个非静态内部类Link,并且您尝试在没有包含类Josephus 的封闭实例的情况下实例化它。

所以要么 make 是静态的

public static class Link

或者使用封闭类的实例来实例化它

Josephus outer = new Josephus();
first = last = outer.new Link (1);
// ...
last.next = outer.new Link(k);

更好的是,将类移动到自己的编译单元中,即文件Link.java,直到您了解inner classes

还有那行

last.next;

不正确。你想用last.next 做什么?您必须将其分配给其他变量。反正我认为你不需要它,只需将其删除即可。

【讨论】:

  • 我正在尝试将链接从列表中的一项移动到跳过一项并随后指向一项,因此本质上它从链接列表中“删除”了一项,因为没有指针指向该项没有了。
  • 我根本不懂封闭类的东西。你能不能给我解释一下??
  • @user2738094 当您声明一个类 Foo 并在该类的声明中,即在开头 { 和结尾 } 之间,您声明另一个类 Bar 然后 @987654333 @被称为inner class,至于里面的所有东西,都必须有东西包围它,这就是Foo类。所以Foo 是外部类——也称为top.level 类——它包含了内部类Bar。在您的情况下,Josephus 是一个包含内部类Link 的外部类。请阅读我为内部类粘贴的链接中的文档,那里有更好的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2013-10-24
  • 2012-08-11
  • 2011-05-17
相关资源
最近更新 更多