从散列 table 中存储密钥
Store the keys from a hash table
我有一个非常基本的 java 代码。有 2 个散列 tables :
Hashtable<String, ArrayList<tuple> > htDOC1 = new Hashtable<String, ArrayList<tuple> >();
Hashtable<String, ArrayList<tuple> > htDOC2 = new Hashtable<String, ArrayList<tuple> >();
如您所见,每个键代表一个词String.Then我有一个方法将 2 个散列 tables 作为参数:
public static void CheckCheaters(Hashtable<String, ArrayList<tuple> > doc1 ,Hashtable<String, ArrayList<tuple> > doc2 ){
Set <String> keysDoc1 = doc1.keySet();
Set <String> keysDoc2 = doc2.keySet();
}
在 KeysDoc1 中,我将第一个散列的键 table 存储在 keysDoc2 中
我已经存储了第二个散列的键 table.
我想遍历这两个集合并检查 keysDoc1 的前 5 个元素是否等于 keysDoc2 的前 5 个元素,然后检查下 5 个 ..etc
你能指导我吗?
我希望我很清楚,我尽力了。
编辑
public static boolean CheckCheaters(SortedMap<String, ArrayList<tuple> > doc1 ,SortedMap<String, ArrayList<tuple> > doc2 ){
boolean checking=true;
Set<String> keysDoc1 = doc1.keySet();
Set<String> keysDoc2 = doc2.keySet();
int count = 0;
for(String s : keysDoc1)
{
if(keysDoc2.contains(s))
count++;
}
if(count>5) {
checking=true;
}
else {
checking=false;
}
return checking;
}
}
您可以使用LinkedHashMap,这意味着HashMap 元素通过双面LinkedList 链接起来。因此,元素按输入顺序排序。
例如:
public static void foo() {
HashMap<String, ArrayList<tuple>> htDOC1 = new LinkedHashMap<String,
ArrayList<tuple>>();
HashMap<String, ArrayList<tuple>> htDOC2 = new LinkedHashMap<String,
ArrayList<tuple>>();
System.out.println(CheckCheaters(htDOC1, htDOC2));
}
public static int CheckCheaters(HashMap<String, ArrayList<tuple>> doc1,
HashMap<String, ArrayList<tuple>> doc2){
if (doc1.size() < 5 || doc2.size() < 5) {
System.out.println("Not enough elements");
return 0;
}
Iterator<String> doc1Keys = doc1.keySet().iterator();
Iterator<String> doc2Keys = doc2.keySet().iterator();
int i = 0;
int counter = 0;
int numOfEquals = 0;
int limit = min(doc1.size(), doc2.size());
while (doc1Keys.hasNext() != null && doc2Keys.hasNext() != null
&& i < limit ){
if (Objects.equals(doc1Keys.next(), doc2Keys.next())
counter++;
if (i % 5 == 0) {
if (counter == 5)
numOfEquals++;
counter = 0;
}
i++;
}
return numOfEquals;
}
编辑 - 我修改了代码以比较 5 个元素的每个序列(不包括同余元素)。
Objects.equals(a,b) 对比 a.equals(b)
请注意,我使用了 Objects.equals(a, b) 而不是 a.equals(b)。不同之处在于后者在其中一个参数为空的情况下失败。使用字符串时请记住这一点(无论您是否想以不同方式处理空指针)。
有关 LinkedHashMap 的更多详细信息 here。
这是基于评论。如果这不是您需要的,请告诉我,我会尽力帮助您。
Set<String> keysDoc1 = doc1.keySet();
Set<String> keysDoc2 = doc2.keySet();
if (keysDoc1.size() != keysDoc2.size()) {
// Different number of elements in both sets.
return false;
}
int checkCount = 0, count5 = 0;
for (int i = 0; i < keysDoc1.size(); i++) {
if (!Objects.equals(keysDoc1.toArray()[i], keysDoc2.toArray()[i]))
checkCount++;
if (i % 5 == 0) {
if (checkCount == 5) {
count5++;
}
checkCount = 0;
}
}
System.out.println(count5);
return true;
不太确定计数点是什么,除非您需要在稍后的代码中使用它。
checkCount 将查看它检查的每 5 个元素中是否有 5 个元素正确。如果 5 个匹配,则它将递增 count5 变量。
我有一个非常基本的 java 代码。有 2 个散列 tables :
Hashtable<String, ArrayList<tuple> > htDOC1 = new Hashtable<String, ArrayList<tuple> >();
Hashtable<String, ArrayList<tuple> > htDOC2 = new Hashtable<String, ArrayList<tuple> >();
如您所见,每个键代表一个词String.Then我有一个方法将 2 个散列 tables 作为参数:
public static void CheckCheaters(Hashtable<String, ArrayList<tuple> > doc1 ,Hashtable<String, ArrayList<tuple> > doc2 ){
Set <String> keysDoc1 = doc1.keySet();
Set <String> keysDoc2 = doc2.keySet();
}
在 KeysDoc1 中,我将第一个散列的键 table 存储在 keysDoc2 中 我已经存储了第二个散列的键 table.
我想遍历这两个集合并检查 keysDoc1 的前 5 个元素是否等于 keysDoc2 的前 5 个元素,然后检查下 5 个 ..etc
你能指导我吗? 我希望我很清楚,我尽力了。
编辑
public static boolean CheckCheaters(SortedMap<String, ArrayList<tuple> > doc1 ,SortedMap<String, ArrayList<tuple> > doc2 ){
boolean checking=true;
Set<String> keysDoc1 = doc1.keySet();
Set<String> keysDoc2 = doc2.keySet();
int count = 0;
for(String s : keysDoc1)
{
if(keysDoc2.contains(s))
count++;
}
if(count>5) {
checking=true;
}
else {
checking=false;
}
return checking;
}
}
您可以使用LinkedHashMap,这意味着HashMap 元素通过双面LinkedList 链接起来。因此,元素按输入顺序排序。
例如:
public static void foo() {
HashMap<String, ArrayList<tuple>> htDOC1 = new LinkedHashMap<String,
ArrayList<tuple>>();
HashMap<String, ArrayList<tuple>> htDOC2 = new LinkedHashMap<String,
ArrayList<tuple>>();
System.out.println(CheckCheaters(htDOC1, htDOC2));
}
public static int CheckCheaters(HashMap<String, ArrayList<tuple>> doc1,
HashMap<String, ArrayList<tuple>> doc2){
if (doc1.size() < 5 || doc2.size() < 5) {
System.out.println("Not enough elements");
return 0;
}
Iterator<String> doc1Keys = doc1.keySet().iterator();
Iterator<String> doc2Keys = doc2.keySet().iterator();
int i = 0;
int counter = 0;
int numOfEquals = 0;
int limit = min(doc1.size(), doc2.size());
while (doc1Keys.hasNext() != null && doc2Keys.hasNext() != null
&& i < limit ){
if (Objects.equals(doc1Keys.next(), doc2Keys.next())
counter++;
if (i % 5 == 0) {
if (counter == 5)
numOfEquals++;
counter = 0;
}
i++;
}
return numOfEquals;
}
编辑 - 我修改了代码以比较 5 个元素的每个序列(不包括同余元素)。
Objects.equals(a,b) 对比 a.equals(b)
请注意,我使用了 Objects.equals(a, b) 而不是 a.equals(b)。不同之处在于后者在其中一个参数为空的情况下失败。使用字符串时请记住这一点(无论您是否想以不同方式处理空指针)。
有关 LinkedHashMap 的更多详细信息 here。
这是基于评论。如果这不是您需要的,请告诉我,我会尽力帮助您。
Set<String> keysDoc1 = doc1.keySet();
Set<String> keysDoc2 = doc2.keySet();
if (keysDoc1.size() != keysDoc2.size()) {
// Different number of elements in both sets.
return false;
}
int checkCount = 0, count5 = 0;
for (int i = 0; i < keysDoc1.size(); i++) {
if (!Objects.equals(keysDoc1.toArray()[i], keysDoc2.toArray()[i]))
checkCount++;
if (i % 5 == 0) {
if (checkCount == 5) {
count5++;
}
checkCount = 0;
}
}
System.out.println(count5);
return true;
不太确定计数点是什么,除非您需要在稍后的代码中使用它。
checkCount 将查看它检查的每 5 个元素中是否有 5 个元素正确。如果 5 个匹配,则它将递增 count5 变量。