2014-01-29 5 views
1

Я пытаюсь сравнить две строки, которые находятся в другом порядке от 2D-массива, и хранить элементы, которые являются одинаковыми из обеих строк. Вот пример того, что я произвел:Сравнение двух строк в одном 2D-массиве

String[] row1 = new String[10]; 
String[] row2 = new String[10]; 
String[][] fruit = {{"apple", "banana", "kiwi"},{"kiwi", "oranges", "grapes"}}; 

for (int i = 0; i < fruit.length; i++) { 
    for (int j = 0; j < fruit[i].length; j++){ 
      if(fruit[0][j].equals(fruit[1][j])) { 
       row1[j] = fruit[0][j]; 
       row2[j] = fruit[1][j]; 

       System.out.println("Match found"); 
      }else{ 
       System.out.println("Not found"); 
      } 
    } 
} 
System.out.println("row1"); 
System.out.println(Arrays.deepToString(row1)); 
System.out.println("row2"); 
System.out.println(Arrays.deepToString(row2)); 

Я хочу row1 [] и row2 [], чтобы сохранить те элементы, которые являются такими же (что киви в этом примере). Однако проблема заключается в том, что функция .equals определяет только совпадающие шаблоны. В приведенном выше примере выводятся только нули из строк1 и строки2.

Он должен действительно распечатать:

row1 
[kiwi] 
row2 
[kiwi] 

Примечание: Я не хочу, чтобы объявить ... String check = "kiwi";, поскольку пользователь может ввести что-либо в 2D массив.

Любые предложения? Я чувствую, что приближаюсь. Я видел аналогичный пример того, кто использует .equals, и это сработало, но это было только для одиночных массивов.

+0

Почему вы хотите хранить два разных t с одинаковыми значениями? –

+0

То же, что и в той же точной строке и точный индекс? –

+0

@Mason Мне нужно сохранить их для создания некоторых форм предложений SQL, которые я буду использовать позже. – user11998

ответ

2

пределы ваших для петель были перепутались, а также элементы массива, которые вы получили доступ для сравнения. Я думаю, вы хотели что-то вроде этого ...

import java.util.Arrays; 

public class RowCompare 
{ 
    public static void main(String[] args) 
    { 
     String[] row1 = new String[10]; 
     String[] row2 = new String[10]; 
     String[][] fruit = {{"apple", "banana", "kiwi"},{"kiwi", "oranges", "grapes"}}; 

     for (int i = 0; i < fruit[0].length; i++) { 
      for (int j = 0; j < fruit[1].length; j++){ 
        if(fruit[0][i].equals(fruit[1][j])) { 
         row1[i] = fruit[0][i]; 
         row2[j] = fruit[1][j]; 

         System.out.println("Match found"); 
        }else{ 
         System.out.println("Not found"); 
        } 
      } 
     } 
     System.out.println("row1"); 
     System.out.println(Arrays.deepToString(row1)); 
     System.out.println("row2"); 
     System.out.println(Arrays.deepToString(row2)); 
    } 
} 

Но, вероятно, вам следует описать, что вы хотите сделать с результатами. Эти массивы результатов фиксированного размера (String [10]) выглядят сомнительными, и в настоящее время набросанный код не может быть легко обобщен для более чем двух строк. Вероятно, существует более элегантное решение MUCH, использующее Set s и List s ....

+0

Эй, раньше у меня было что-то подобное, но в то время у меня были фрукты [0] [i] .length И знал, что я сделал, было неправильно. Спасибо btw, я просто ненавижу 2D-массивы и все еще пытаюсь привыкнуть к этому. – user11998

1

Ваше решение очень неэффективен, так как вы не воспользоваться оптимизации алгоритмов хэширования, как:

Вы должны использовать HashSet или в HashMap, чтобы найти быстрее, если элемент содержится.

В дополнении коллекции есть готовые методы, как retainAll() держать только существующие элементы (HashSet реализует коллекцию, так что это хороший кандидат для ваших нужд)

retainAll: Сохраняет только элементы в этой коллекции, которые содержатся в указанный набор (дополнительная работа)

HashSet row1 = new HashSet(); 
row1.add("Kiwi"); 
... 
HashSet row2 = new HashSet(); 
row2.add... 

System.out.println(row1.retainAll(row2)); 
2

Вы ошибаетесь в своей петле.

Если вы посмотрите, что вы сравниваете

fruit[0][0].equals(fruit[1][0]) 

затем

fruit[0][1].equals(fruit[1][1]) 

изменить, если заявление

if(fruit[0][i].equals(fruit[1][j])) { 
+0

Его логика не *** все *** неправильно. Это немного неправильно. –

+0

Вы правы, я отредактирую –

+0

Существует еще одна ошибка, когда он присваивает переменные новому массиву вывода массива. | = ^] –

1

Это менее запутанным, чтобы поместить подмассивы во временную (1D) массивы: row1Temp и row2Temp.

import java.util.Arrays; 
/** 
    <P>{@code java DoubleArrayXmpl}</P> 
**/ 
public class DoubleArrayXmpl { 
    public static final void main(String[] igno_red) { 
     String[] row1Output = new String[10]; 
     String[] row2Output = new String[10]; 

     String[][] fruit = {{"apple", "banana", "kiwi"},{"kiwi", "oranges", "grapes"}}; 

     String[] row1Temp = fruit[0]; 
     String[] row2Temp = fruit[1]; 

     for(int i = 0; i < row1Temp.length; i++) { 
     for(int j = 0; j < row2Temp.length; j++) { 
      if(row1Temp[i].equals(row2Temp[j])) { 
       System.out.println("Match found"); 
       row1Output[i] = row1Temp[i]; 
       row2Output[j] = row2Temp[j]; 
      }else{ 
       System.out.println("Not found"); 
      } 
     } 
     } 

     System.out.println("row1Output"); 
     System.out.println(Arrays.deepToString(row1Output)); 
     System.out.println("row2Output"); 
     System.out.println(Arrays.deepToString(row2Output)); 
    } 
} 

Выход:

[C:\java_code\]java DoubleArrayXmpl 
Not found 
Not found 
Not found 
Not found 
Not found 
Not found 
Match found 
Not found 
Not found 
row1Output 
[null, null, kiwi, null, null, null, null, null, null, null] 
row2Output 
[kiwi, null, null, null, null, null, null, null, null, null] 

Я не знаю ваших требований, но это немного странно, чтобы положить эти повторяющиеся значения в двух различных массивов, не говоря уже о выходе так много значений NULL. Как насчет использования ArrayList для хранения одиночный экземпляр подходящих фруктов?

import java.util.Arrays; 
/** 
    <P>{@code java DoubleArrayXmpl}</P> 
**/ 
public class DoubleArrayXmpl { 
    public static final void main(String[] igno_red) { 
     ArrayList<String> alMatches = new ArrayList<String>(3); 

     String[][] fruit = {{"apple", "banana", "kiwi"},{"kiwi", "oranges", "grapes"}}; 

     String[] row1Temp = fruit[0]; 
     String[] row2Temp = fruit[1]; 

     for(int i = 0; i < row1Temp.length; i++) { 
     for(int j = 0; j < row2Temp.length; j++) { 
      if(row1Temp[i].equals(row2Temp[j])) { 
       System.out.println("Match found"); 
       alMatches.add(row1Temp[i]); 
      }else{ 
       System.out.println("Not found"); 
      } 
     } 
     } 

     System.out.println("All matched fruits:"); 
     for(String s : alMatches) { 
     System.out.println(s); 
     } 
    } 
} 

Выход:

Not found 
Not found 
Not found 
Not found 
Not found 
Not found 
Match found 
Not found 
Not found 
All matched fruits: 
kiwi 

Или еще лучше, просто хранить индексирует из матчей:

import java.util.Arrays; 
    import java.util.ArrayList; 
/** 
    <P>{@code java DoubleArrayToMatchedIdxListXmpl}</P> 
**/ 
public class DoubleArrayToMatchedIdxListXmpl { 
    public static final void main(String[] igno_red) { 
     ArrayList<Integer> alMatchIdxsInRow1 = new ArrayList<Integer>(3); 

     String[][] fruit = {{"apple", "banana", "kiwi"},{"kiwi", "oranges", "grapes"}}; 

     String[] row1Temp = fruit[0]; 
     String[] row2Temp = fruit[1]; 

     for(int i = 0; i < row1Temp.length; i++) { 
     for(int j = 0; j < row2Temp.length; j++) { 
      if(row1Temp[i].equals(row2Temp[j])) { 
       System.out.println("Match found"); 
       alMatchIdxsInRow1.add(i); 
      }else{ 
       System.out.println("Not found"); 
      } 
     } 
     } 

     System.out.println("All matched fruits:"); 
     for(int i : alMatchIdxsInRow1) { 
     System.out.println(fruit[0][i]); 
     } 
    } 
} 

Выход:

Not found 
Not found 
Not found 
Not found 
Not found 
Not found 
Match found 
Not found 
Not found 
All matched fruits: 
kiwi 
+0

Да, это было бы намного проще, если бы это было в массиве 1D. – user11998

+0

Я слышал о ArrayLists, он устранил бы все нулевые значения. – user11998

+0

Или лучше всего использовать HashSet и получить пересечение, как это предлагается в другом ответе. – aliteralmind

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