问题
As i am new to java i got a task to find duplicate word only and its count. i stuck in a place and i am unable to get the appropriate output. I can not use any collections and built in tool. i tried the below code. Need some help, Please help me out.
public class RepeatedWord
{
public static void main(String[] args)
{
String sen = "hi hello hi good morning hello";
String word[] = sen.split(" ");
int count=0;
for( int i=0;i<word.length;i++)
{
for( int j=0;j<word.length;j++)
{
if(word[i].equals(word[j]))
{
count++;
}
if(count>1)
System.out.println("the word "+word[i]+" occured"+ count+" time");
}
}
}
}
expecting output:-
the word hi occured 2 time
the word hello occured 2 time
but i am getting output like below :-
the word hi occured 2 time
the word hi occured 2 time
the word hi occured 2 time
the word hi occured 2 time
the word hello occured 2 time
the word hi occured 2 time
the word hi occured 2 time
the word hi occured 2 time
the word hi occured 2 time
the word hello occured 2 time
please help me to get the output like i am expecting. and please explain. so that i can understand too. Thanks in advance
回答1:
You need to print the result only for the outer loop. Also, you need to avoid checking the words that were already checked in previous iteration:
for (int i = 0; i < word.length; i++) {
int count = 0; // reset the counter for each word
for (int j = 0; j < word.length; j++) {
if (word[i].equals(word[j])) {
/* if the words are the same, but j < i, it was already calculated
and printed earlier, so we can stop checking the current word
and move on to another one */
if (j < i) {
break; // exit the inner loop, continue with the outer one
}
count++;
}
}
if (count > 1) {
System.out.println("the word " + word[i] + " occured " + count + " time");
}
}
UPDATE
Additional explanation around this code: if (j < i) { break; }
i
is the index of the word we calculate duplicates for, j
is the word we compare it against. Since we start always from beginning, we know that if the words are equal while j < i
, it was already processed in earlier run of the outer loop.
In this case, using break
, we interrupt the inner loop and the flow continues in the outer loop. As we didn't update count
at all, it is still zero and thus the condition for printing the result if (count > 1)
is not satisfied and the println
is not executed.
Example for the word "hello", using simple pseudo-code in the following part.
For its first occurrence:
count = 0
i = 1, j = 0 --> hello != hi --> do nothing
i = 1, j = 1 --> hello == hello, j is not < i --> count++
i = 1, j = 2 --> hello != hi --> do nothing
i = 1, j = 3 --> hello != good --> do nothing
i = 1, j = 4 --> hello != morning --> do nothing
i = 1, j = 5 --> hello == hello, j is not < i --> count++
count > 1 --> print the result
For its second occurrence:
count = 0
i = 5, j = 0 --> hello != hi --> do nothing
i = 5, j = 1 --> hello == hello, j < i --> break, we have seen this pair earlier
count is not > 1 --> result not printed
Hope I didn't make things more complicated with this example
回答2:
Print Outside first for loop,This will do the trick and initialize count=0 in for loop beginning
for( int i=0;i<word.length;i++)
{
count=0;
for( int j=0;j<word.length;j++)
{
if(word[i].equals(word[j]))
{
count++;
}
}
if(count>1)
System.out.println("the word "+word[i]+" occured"+ count+" time");
}
回答3:
enter code here
import java.util.*;
class test{
public static void main(String[] args){
String s;
int count=0;
int count1=0;
System.out.println("Enter the Sentence");
Scanner scan=new Scanner(System.in);
s=scan.nextLine();
System.out.println(s);
String[] arr=s.split(" ");
String[] srr=new String[arr.length];
int[] rev=new int[arr.length];
for(int i=0;i<arr.length; i++)
{ if(arr[i]!="NULL"){
String temp=arr[i];
for(int j=i+1;j<arr.length; j++)
{
if(temp.equals(arr[j]))
{
arr[j]="NULL";
count++;
}
}
srr[count1]=temp;
rev[count1]=count;
count=0;
count1++;
}
}
for(int i=0;i<count1;i++)
System.out.println(srr[i]+" "+rev[i]);
}
}
来源:https://stackoverflow.com/questions/32798271/find-the-duplicate-word-from-a-sentence-with-count-using-for-loop