Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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_String_Dictionary - Fatal编程技术网

Java 创建字典:防止同一单词被多次添加的方法

Java 创建字典:防止同一单词被多次添加的方法,java,arrays,string,dictionary,Java,Arrays,String,Dictionary,我需要创建一个方法来确定我试图添加到String[]字典中的单词是否已经添加。我们不允许在此项目中使用ArrayList,只能使用数组 我是从这个开始的 public static boolean dictHasWord(String str){ for(int i = 0; i < dictionary.length; i++){ if(str.equals(dictionary[i])){ return true; }

我需要创建一个方法来确定我试图添加到String[]字典中的单词是否已经添加。我们不允许在此项目中使用ArrayList,只能使用数组

我是从这个开始的

public static boolean dictHasWord(String str){
    for(int i = 0; i < dictionary.length; i++){
       if(str.equals(dictionary[i])){
           return true;
       }
    }
    return false;
}
public静态布尔dictHasWord(String str){
for(int i=0;i

然而,我的教授告诉我不要使用这个,因为它是一个线性函数O(n),并且是无效的。还有什么方法可以解决这个问题呢?

这是一个如何快速搜索可读性好的数组的示例。我建议使用此方法搜索数组

import java.util.*;

public class test {

public static void main(String[] args) {
    String[] list = {"name", "ryan"
    };
    //returns boolean here
    System.out.println(Arrays.asList(list).contains("ryan"));
    }
}

如果允许将类用作赋值的一部分,则可以对数组排序并使用二进制搜索,而不是O(n)

记住你必须先分类

编辑:

关于编写您自己的实现,这里有一个方法可以帮助您继续。这里还有一些建议。这里(基于int的示例)显示了递归和非递归之间的区别,特别是在Java中。

虽然在这种情况下可能有点过分,但哈希表不是O(n)

这使用了一个事实,即每个字符串都可以通过
hashCode()
转换为int,相等的字符串将生成相同的哈希

我们的词典可以声明为:

LinkedList<String>[] dictionary;
但要做到这一点,需要将数组大小设置为小于最大值
hashCode()
函数的1。这对你来说可能太多了。所以我们可以做一些不同的事情:

public void add(String str)
{
  dictionary[str.hashCode()%dictionary.length].add(str);
}
这样我们总是修改散列。为了得到最好的结果,你应该让你的字典大小为一些素数,或者至少是一个素数的幂

然后,当您想要测试字符串的存在性时,您可以完全按照原始字符串中的内容进行操作,但可以使用从散列中获得的特定
LinkedList

public static boolean dictHasWord(String str)
{
    for(String existing : dictionary[str.hashCode()%dictionary.length])
    {
       if(str.equals(existing)){
           return true;
       }
    }
    return false;
}
在这一点上,你可能会问“这不是O(n)吗?”。答案是不是,因为哈希函数没有考虑数组中元素的数量。给数组的内存越多,冲突就越少,这种方法朝着O(1)方向移动的次数也越多



如果有人在寻找真正的答案(不是家庭作业)时找到了这个答案。然后只需使用
HashMap

是否允许使用Arrays类?您了解哪些数据结构可能允许您使用?有两个明显的答案,但如果它们涉及到您一直在学习的数据结构,那么这是一个测试,以确保您已经学习了它,我犹豫是否给您答案;如果你还没有了解它们,那么期望你自己去了解它们就太过分了。如果不知道真正的限制和上下文的其余部分,很难回答这样的问题。我们只能使用字符串数组创建字典。没有ArrayList之类的。唯一的其他限制是我们不能调用Arrays.sort()或Arrays.binarySearch()。我们从3个包含全文书籍的单独文本文件中读取单词,然后创建一个字符串[]字典,我们将对其进行排序并将其放入自己的文件dictionary.txt中。我们不能在字典中添加同一个单词两次,单词的长度必须大于1,并且单词不能以大写字母开头。我只需要让这个方法更有效。它和我以前的一样。基于连续字符搜索单词。您只需与以第一个字母作为新词开始的词典条目进行比较。这大大减少了搜索/比较时间。这仍然是一个O(n)解决方案。定义O(n)解决方案?这是线性搜索的另一个术语吗?如果你不寻找线性,我会研究一种递归的排序方法。o(n)表示它在时间上与“n”成比例地运行。线性搜索是O(n)算法的一个例子。而
列表上的
contains()
方法是线性搜索。当我在方法中使用for循环时,如果是最坏的情况,我必须搜索数组中的每个元素。因此,它的大o表示法是o(n)。是的,我们可以使用arrays类,但是我们不能调用arrays.sort或使用它的搜索方法。我们必须创建自己的排序方法,然后在添加每个单词后立即调用我们的排序方法。根据您上面的评论,除了实际的搜索方法,您似乎拥有所有需要的东西,但是您不能使用已经提供的。为什么不实现你自己的呢?好的,我们已经学习了二进制搜索。我理解你刚刚发布的链接,但是,现在我正在搜索是否已经添加了字符串。如何使用字符串而不是整数实现二进制搜索。添加了一个示例。有一些关于代码质量和算法如何工作的评论也很有用。还包括Javadoc for.compareTo,因为在本例中,了解所有这些是如何结合在一起的非常重要。
public void add(String str)
{
  dictionary[str.hashCode()%dictionary.length].add(str);
}
public static boolean dictHasWord(String str)
{
    for(String existing : dictionary[str.hashCode()%dictionary.length])
    {
       if(str.equals(existing)){
           return true;
       }
    }
    return false;
}