Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决这个数组问题_Java_Arrays - Fatal编程技术网

Java 如何解决这个数组问题

Java 如何解决这个数组问题,java,arrays,Java,Arrays,所以我在java编程课上学习数组,我得到了一个对我来说非常有挑战性的程序。我必须用一系列行组成的输入文件编写一个程序,每行一个字。我必须编写一个程序,告诉用户这个单词是否使用不同的字母或重复的字母 这是我的输入文件: UNCOPYRIGHTABLE FLIPPER EXECUTABLE UNPROFITABLE QUESTIONABLE WINDOW TAMBOURINE 这就是我现在拥有的: Scanner df = new Scanner (new Files (distinctlet.i

所以我在java编程课上学习数组,我得到了一个对我来说非常有挑战性的程序。我必须用一系列行组成的输入文件编写一个程序,每行一个字。我必须编写一个程序,告诉用户这个单词是否使用不同的字母或重复的字母

这是我的输入文件:

UNCOPYRIGHTABLE
FLIPPER
EXECUTABLE
UNPROFITABLE
QUESTIONABLE
WINDOW
TAMBOURINE
这就是我现在拥有的:

Scanner df = new Scanner (new Files (distinctlet.in"));

while (df.hasNextLine())
{
    String line = df.nextLine();
    String array [] = line.split("");

    String ans = "";

    for (int k = 0; k < array.length; k++)
    {

        for (int m = k + 1; m < array.length; m++)
        {
            if (!array[k].equals(array[m])
            {
                ans = "USES DISTINCT LETTERS";
            }
            else
            {
                ans = "DOES NOT USE DISTINCT LETTERS";
            }

        }//FOR LOOP2

    }//FOR LOOP

    System.out.println(line + " " + ans);

}//WHILE DF
等等


我现在的输出是输入的单词,并不是每一行都使用不同的字母。我知道问题在嵌套循环中,但我不知道如何解决这个问题。谢谢你的帮助。

就我个人而言,我不会使用数组来做这件事,我会使用地图。即使你必须使用数组,我仍然会以地图的精神来解决这个问题

这里,计数器数组的作用类似于映射键=索引,值=计数

public class Test {

    public static void main(String[] args) throws IOException {
        byte[] encoded = Files.readAllBytes(Paths.get("data/input.csv"));
        String s = new String(encoded, Charset.defaultCharset());
        String[] split = s.split("\n");
        System.out.println("Input: " + Arrays.toString(split));
        System.out.println("Output: " + Arrays.toString(check(split)));
    }

    private static String[] check(String[] strings) {
        for (int i = 0; i < strings.length; i++)
            strings[i] += distinct(strings[i])
                    ? " USES DISTINCT LETTERS"
                    : " DOES NOT USE DISTINCT LETTERS";
        return strings;
    }

    private static boolean distinct(String string) {
        int[] counter = new int[string.length()];
        for (char c : string.toCharArray())
            if (++counter[string.indexOf(c)] > 1) return false;
        return true;
    }
}

您可以使用字符位置来确定它是否存在于字符串中的其他位置。 考虑下面的解决方案:

        while (df.hasNextLine()) {
            String line = df.nextLine();
            String array[] = line.split("");
            String ans = "USES DISTINCT LETTERS";

            for (int k = 0; k < array.length; k++) {
                if(line.indexOf(array[k]) != line.lastIndexOf(array[k])){
                    ans = "DOES NOT USE DISTINCT LETTERS";
                    break;
                }

            }//FOR LOOP

            System.out.println(line + " " + ans);

        }//WHILE DF

解决编程问题时,我做的第一件事是绘制/绘制/写出sudo伪代码和图片。我总是这样做。随着编程技能的成熟,这会变得更容易

有了这样的问题,我会首先思考如何解决核心问题

核心问题:检测具有重复字符的字符串

考虑到这一点,我的第一个想法是遍历每个字符串,对照前面的位置检查每个位置

字符串输入=输入字符串; forint i=1;i
希望这有帮助

要解决这类问题,您可以这样做,此解决方案可以很容易地解决您的问题,但这里我们只需要一个256长度的数组的常量空间,复杂性将取决于:


我希望你已经有了一个想法。

这个解决方案有很多问题。对于初学者,为什么`String array[]=line.split;`?在用代码处理之前,应该用简单的伪代码描述解决方案。@SubirKumarSao它将行拆分为单个字符。当然,您可以只使用tocharray,这将是一个char[]而不是一个String[],但在逻辑上,您最终得到的是相同的东西:一个包含单个字符的元素数组。这几乎不是这里最重要的问题。@SubirKumarSao确定吗?算法需要调整;当前代码返回最后一次比较的结果;相反,首先假设单词确实使用不同的字母,然后在循环过程中,如果发现重复的单词,您知道它不使用不同的字母。
Input: [UNCOPYRIGHTABLE, FLIPPER, EXECUTABLE, UNPROFITABLE, QUESTIONABLE, WINDOW, TAMBOURINE]
Output: [UNCOPYRIGHTABLE USES DISTINCT LETTERS, FLIPPER DOES NOT USE DISTINCT LETTERS, EXECUTABLE DOES NOT USE DISTINCT LETTERS, UNPROFITABLE USES DISTINCT LETTERS, QUESTIONABLE DOES NOT USE DISTINCT LETTERS, WINDOW DOES NOT USE DISTINCT LETTERS, TAMBOURINE USES DISTINCT LETTERS]
for (int k = 0; k < array.length; k++)
{

  for (int m = k + 1; m < array.length; m++)
  {
      if (!array[k].equals(array[m])
      {
        ans = "USES DISTINCT LETTERS";
      }
      else
      {
        ans = "DOES NOT USE DISTINCT LETTERS";
        // Break out of the two loops once you know the characters are matching. 
        //Otherwise it loops again and the last match of character is what you get the ans.
      }

   }//FOR LOOP2

}//FOR LOOP
        while (df.hasNextLine()) {
            String line = df.nextLine();
            String array[] = line.split("");
            String ans = "USES DISTINCT LETTERS";

            for (int k = 0; k < array.length; k++) {
                if(line.indexOf(array[k]) != line.lastIndexOf(array[k])){
                    ans = "DOES NOT USE DISTINCT LETTERS";
                    break;
                }

            }//FOR LOOP

            System.out.println(line + " " + ans);

        }//WHILE DF
int []star = new int[256];
        while (df.hasNextLine())
        {
            Arrays.fill(star,0);
            String line = df.nextLine();
            for(int i=0;i<line.length();i++){
                star[line.charAt(0)]++;
            }
            for(int i=0;i<256;i++){
                if(star[i]>0 && star[i]>1){
                    System.out.println("Duplicate characters present..");
                }
            }
            System.out.println("No Duplicate characters present..");
            }