2015-09-29 5 views
0

Добрый день всем. Я не совсем уверен, как проверить те же элементы в примере массива. % java stuff 4 6 1 2 3 1 /* Теперь, когда в массиве есть два, он должен выкачать «Да! То же самое!» */ Я действительно понимаю, что могу взять первое значение в массиве и проверьте это с помощью цикла for, а затем и так далее и т. д. Я пока не совсем уверен в синтаксисе. До сих пор я пробовал поставить if, если он проверял, что это не работает. Может ли кто-нибудь быть таким добрым и помочь мне понять мой проект немного лучше? P.s. Я открыт для всех улучшений этого вопроса.Как увидеть, являются ли два целых числа в массиве одинаковыми

public class seeIT 
    { 
     public static void main (String[] args) 
     { 
     int N = args.length; 
     int [] a = new int[N]; 

     boolean flag = false; 
     for (int i = 0; i < N; i++) 
     { 
     a[i] = Integer.parseInt(args[0]); 

     } 
     for(int i = 0; i < N; i++) 
     for(int j = i +1; j < N; j++) 
{ if(a[i] == a[j]) 
    { flag = true; 
} else 
    { 
     System.out.print("correct, there are no numbers that are the same here");} 



     } 

    } 
    } 
  • Я создал логический флаг, потому что, опять же, я понимаю, что мне нужно, чтобы проверить, является ли истинным утверждение или нет. Спасибо всем за добрые ответы и приятный день. Josef.
+0

Я не видел никаких условий 'if' здесь. –

+0

У вас есть 3 открывающих брекета, но 4 закрывающих. Чего-то не хватает. – Henry

+0

Как вы сказали, наивный, но все же эффективный подход состоял бы в том, чтобы пройти через массив и сравнить текущее значение со всеми, что следует за ним. Должна быть легко реализована, если вы знаете некоторые основы программирования. Лучший подход может заключаться в том, чтобы сначала отсортировать массив или использовать какое-то отображение. – Thomas

ответ

1

Добавить элементы в набор (HashSet), если set.add возвращает false для элемента, что означает, что этот элемент повторяется.

1

Есть некоторые недостатки в вашем коде: Это читает всегда первый элемент массива: a[i] = Integer.parseInt(args[0]);, то boolean никогда не оценивается, а переменная N ненужно (и в Java локальных переменных должны начинаться с строчными буквами).

Я думаю, это то, что вы хотите:

int[] a = new int[args.length]; 
for (int i = 0; i < a.length; i++) { 
    a[i] = Integer.parseInt(args[i]); 
} 

for (int i = 0; i < a.length; i++) { 
    for (int j = i + 1; j < a.length; j++) { 
     if (a[i] == a[j]) { 
      System.out.print("same " + a[i]); 
     } 
    } 
} 

Но лучший способ (как уже упоминалось) будет использовать HashSet. Таким образом, вам даже не нужно преобразовывать строки в int. Просто сравните значения, используя equals() insted of ==. Код еще проще:

public static void main(String[] args) {   
     java.util.Set<String> dbl = new java.util.HashSet<String>(); 

     for (int i = 0; i < args.length; i++) { 
      for (int j = i + 1; j < args.length; j++) { 
       if (args[i].equals(args[j])) { 
        dbl.add(args[i]); 
       } 
      } 
     } 

     System.out.print("" + dbl.size() + " figure(s) appear more than once."); 
     java.util.Iterator<String> it = dbl.iterator(); 
     while (it.hasNext()) { 
      System.out.print(" " + it.next()); 
     } 
    } 
+0

Подождите? я использовал [0]? Я сделал 0_0 глупо меня. – Josef

1

HashSet бы класс использовать для такого рода проблемы, однако это не помешает сделать это «вручную», если вы учитесь. Вот некоторые комментарии на ваш код:

a[i] = Integer.parseInt(args[0]); 

Я предполагаю, что вы имели в виду

a[i] = Integer.parseInt(args[i]); 

иначе вы бы положить args[0] на каждой позиции в a.

if(a[i] == a[j]) { 
    flag = true; 
} else { 
    System.out.print("correct, there are no numbers that are the same here"); 
} 

Вы печатаете результат слишком рано - прежде чем сможете это узнать. На этом этапе вы просто знаете, являются ли два отдельных элемента одинаковыми (и вы правильно устанавливаете флаг, если они есть), но вам нужно подождать, пока циклы не закончатся, чтобы знать, что таких элементов не было во всем массиве.

1

Прежде всего, я бы предложил использовать HashSet, так как он позаботится обо всех проверках повторения. Но поскольку вы находитесь на этапе обучения, я скорее придерживаюсь вашего подхода.

Предлагаю поставить логику проверки массива в отдельный метод, который возвращает boolean.Таким образом, вы можете вернуть true, как только найдете многократное число (return немедленно выйдет из метода), тем самым избегая бесполезного итерации по остальной части массива. Это также делает ваш код многоразовым.

Приведенный ниже код. Я также сделал некоторые переформатирования, чтобы сделать код более удобочитаемым, и я исправил опечатку, которая заставляет ваш код повторно добавлять первый аргумент в массив int.

public class SeeIT { 

    public static void main(String[] args) { 
    int n = args.length; 
    int[] a = new int[n]; 

    boolean flag = false; 
    for (int i = 0; i < n; i++) { 
     a[i] = Integer.parseInt(args[i]); 
    } 
    boolean repeats = hasRepetitions(a); 
    if (repeats) { 
     System.out.println("There is at least one repeated number."); 
    } else { 
     System.out.println("correct, there are no numbers that are the same here"); 
    } 
    } 

    private static boolean hasRepetitions(int[] a) { 
    int n = a.length; 
    for (int i = 0; i < n; i++) { 
     for (int j = i + 1; j < n; j++) { 
     if (a[i] == a[j]) { 
      return true; 
     } 
     } 
    } 
    return false; 
    } 

} 

Я надеюсь, что это поможет ...

Cheers,

Джефф

0
public class SeeIT { 

    public static void main(String[] args) { 
      int [] a = new int[]{1,2,5,4,3,7,2}; 

      boolean flag = false; 
      for(int i = 0; i< a.length; i++){ 
        for(int j = 0; j< a.length; j++){ 
         if(a[j] == a[i]){ 
          if(j != i) { 
          flag = true; 
          } 
         } 
        } 
      } 

      if(flag == true){ 
        System.out.println("Duplicates"); 

      }else{ 
        System.out.println("not duplicate"); 
      } 



    } 

} 
} 

Это для цикла следует сделать трюк. Это двойной цикл for, который выполняет итерацию в одном массиве.

Смежные вопросы