2016-03-29 4 views
2

最近、プログラミングをもっと理解するためにコンピュータサイエンスコースを始めましたが、ArrayListsに関するラボでは障害が発生しているようです。このプログラムの目的は、x個の文字列をArrayListに入れ、その結果を降順で出力することです。ArrayList内の文字列の長さで配列リストをソートする方法

例:ゼブラ、シカ、キリン 鹿

結果:キリン、シマウマ、鹿

私はオンラインの周りを見て、ArrayListのコンパレータを使用した例をいくつか見つかりましたが、私たちの教授は、私たちがそれをやりたいました最大の単語をフィルタリングして印刷して削除し、すべての単語が印刷されるまでそのループを続行します。ここで

は、これまでの私のコードです:

public static void main(String[] args) { 

    Scanner input = new Scanner(System.in); 
    int length = 0; 
    String longest = ""; 
    String currentWord = ""; 
    ArrayList <String> DescendArray = new ArrayList<String>(); 
    System.out.println("What would you like to add to the list?"); 
    String userInput = input.next(); 
    while(!userInput.equals("d")) 
    { 
     DescendArray.add(userInput); 
     userInput = input.next(); 
    } 
    for (int i=0; i < DescendArray.size(); i++) 
    { 
     if (DescendArray.get(i).length() > longest.length()) 
       { 
        currentWord = DescendArray.get(i); 
        if (currentWord.length() > longest.length()) 
        { 
         longest = currentWord; 
         length = longest.length(); 
        } 
       } 
     for (int j=1; j < DescendArray.size() -1 ; j++) 
     { 
      if (DescendArray.get(j - 1).length() > longest.length()) 
      { 
       DescendArray.remove(j - 1); 
      } 
      System.out.println(longest + " " + length); 
     } 
    } 
} 

}

私は私のエラーは、内部ループのどこかにあると仮定していますが、私はそれがどんなに多くの仕事しないことを得るように見えることはできません私が使用するさまざまなバリエーション。

+0

「私は私のエラーがどこかに内部ループであると仮定しています」 - エラーとは何ですか?コンパイルしていない、例外を投げている、または間違った結果を出していますか? – resueman

+0

コードは罰金コンパイル、ここでの例入力と出力リレーです: 入力:キリン、カバ、シマウマ 出力:キリン、キリン、キリン – Nare

+0

それは言葉を繰り返して削除する必要がありますか?あなたの例では、鹿は出力に一度だけ書き込まれます。 –

答えて

3

これは、あなたが得たものを基本的にです:重複する単語が順に削除されるような言葉が同時に除去する必要はない重複する前提の下で、

public class Zoo { 

    public static void main(String[] args) { 
     List<String> zoo = new ArrayList<String>(); 
     zoo.add("Zebra"); 
     zoo.add("Deer"); 
     zoo.add("Giraffe"); 
     zoo.add("Deer"); 
     while(!zoo.isEmpty()) { 
      String bigger = ""; 
      for(String animal : zoo) { 
       if(animal.length() > bigger.length()) { 
        bigger = animal; 
       } 
      } 
      System.out.println(bigger); 
      while(zoo.contains(bigger)) { 
       zoo.remove(bigger); 
      } 
     } 
    } 

} 
+0

あなたはおそらくそれぞれの除去のために動物を印刷し、彼の予想される出力に基づいて、それぞれの除去のプリントがあるべきです。 –

+0

彼のポストによると - 結果:キリン、シマウマ、鹿 – Ulises

+0

@Ulises、罰金だけでなく、私の答えは、本質的に同じアルゴリズムを使用して... – KevinO

0

、およびリスト必要があることアルファベット順に並べることはできません(リストを最初にソートすることができます)。スレッドの安全性は重要ではありません。整数カウンタの使用やサイズの確認は避けてください。代わりに、すべてが削除されるまで出力ループを実行します。一例として、

public void doRemove() 
{ 
    while (! descendArray.isEmpty()) { 
     String longest = ""; 

     for (String s : descendArray) { 
      if (s.length() > longest.length()) { 
       longest = s; 
      } 
     } 

     if (longest.length() > 0) { 
      if (descendArray.remove(longest)) { 
       System.out.println(longest + " (" + longest.length() + ")"); 
      } 
     } 
    } // while we stil have things to process 
} 
1

これは動作するようです。反復動物を取り除きたくない場合はdistinct()メソッドを削除してください。私はリストの作成を省いた。

import java.util.Arrays; 
import java.util.List; 
import java.util.stream.Collectors; 

public class Zoo { 
    public static void main(String[] args) { 
     List<String> zoo = Arrays.asList("Zebra", "Deer", "Giraffe", "Deer"); 
     String output = zoo.stream() 
          .distinct() 
          .sorted((x, y) -> Integer.compare(y.length(), x.length())) 
          .collect(Collectors.joining(",")); 
     System.out.println(output); 
    } 
} 
0

問題は、それがあなたのforループの各反復のためのようです、あなたは、あなたがそれが長いキリンよりかどうかを確認するために、リストの残りの部分をチェックしている、あなたの最も長い単語としてキリンに到着します。それは次の最長のエントリを見つけた前に、まず最長の単語を見つけるインデックスとプリントを保存し、そのインデックスのエントリを削除する必要があります。これは、forループの入れ子に

for (int i=0; i < DescendArray.size(); i++) 
{ 
    longest = ""; 
    length = longest.length(); 
    int longestIndex = 0; 
    for (int j=1; j < DescendArray.size() -1 ; j++) 
    { 
     currentWord = DescendArray.get(j); 
     if (currentWord.length() > longest.length()) 
     { 
      longestIndex = j; 
      longest = currentWord; 
      length = longest.length(); 
     } 
    } 
    DescendArray.remove(longestIndex); 
    System.out.println(longest + " " + length); 
} 

:代わりにあなたが今持っているもので、私は次のように書きます。

0

と降順の場合あなたは文字列の長さまたはアルファベットの比較を参照していますか?

QuickSort algorithmを文字列の並べ替えに使用する方法を確認してください。あなたはここにinformation on QuickSort here

+0

私は文字列の長さを参照していますので、最長文字列から最下位文字列に並べます。 – Nare

0

を見つけることができます使用することができます別のバリエーションがあるが、余分な配列リストが含ま:

ArrayList<String> DescendArray = new ArrayList<>(); 
DescendArray.add("Monkey"); 
DescendArray.add("Giraffe"); 
DescendArray.add("Hippo"); 
DescendArray.add("Zebra"); 
DescendArray.add("Monkey"); 

List<String> copy = new ArrayList<>(DescendArray); 

for (int i=0; i<DescendArray.size(); i++) { 
    String longest = ""; 
    for (int j=0; j<copy.size(); j++) { 
     String current = copy.get(j); 
     if (current.length() > longest.length()) { 
      longest = current; 
     } 
    } 
    System.out.println(longest); 
    while(copy.contains(longest)) { 
     copy.remove(longest); 
    }   
} 
+0

これは完全に機能し、必要な正確な出力を得ました!私の問題は、間違ったことをしていたループでしたが、2番目のArrayListを追加することで、問題がどこにあるのかを確かに比較することができました。 ありがとうございました! – Nare

+0

助けてくれてうれしい!余分なリストを使用するので、これは最も効率的なソリューションではないことに注意してください。より効率的なものは、@Ulisesによって提案されるものです。 – hanif

0

リストから要素を削除する必要が、イテレータがより良い方法です。コードについては以下を参照してください。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.List; 

public class Zoo { 
    public static void main(String[] args) { 
     List<String> zoo = new ArrayList<String>(); 
     zoo.add("Zebra"); 
     zoo.add("Deer"); 
     zoo.add("Giraffe"); 
     zoo.add("Deer"); 
     Collections.sort(zoo,new Comparator<String>() { 
      @Override 
      public int compare(String o1, String o2) {   
       return o2.compareTo(o1); 
      } 
     }); 
     Iterator<String> iterator=zoo.iterator(); 
     while (iterator.hasNext()) { 
      System.out.println(iterator.next()); 
      iterator.remove(); 
     } 
    } 
} 
0

私は他の解決策の冗長さに驚いています。もっと簡単な方法は、ストリームを使うことです:

List<String> original = Arrays.asList("s1", "String 2", "ss3", "s"); 
List<String> sorted = original.stream() 
     .sorted((s1, s2) -> s2.length() - s1.length()) 
     .collect(Collectors.toList()); 
System.out.println(sorted); 

"オリジナル"をArrayListに置き換えます。それは、各文字列の長さだ上で、あなたが試すことができますベースのArrayListをソートするために

0

private ArrayList SortwithStrlength(ArrayList templist) { 
     for(int i=0;i<templist.size();i++) 
     { 
      for(int j=0;j<templist.size();j++) 
      { 
       String temp; 
       if(templist.get(i).toString().length()<templist.get(j).toString().length()) 
       { 
        temp=templist.get(i).toString(); 
        templist.set(i, templist.get(j).toString()); 
        templist.set(j,temp); 
       } 
      } 
     } 
     return templist; 
    }