0

さて、私は2D配列を並べ替える方法に取り組んでいます。一方の次元には文字列があり、もう一方の次元にはintがあります(便宜上、文字列として保存されています)。 firstArray [1]からのデータがfirstArray[0]として同時に移動される方法(そのインデックスは:の移動の子です)。

この効果はこれを使用することによって達成されました

Arrays.sort(fps, new Comparator<String[]>() {
            @Override
            public int compare(final String[] entry1, final String[] entry2) {
                final String time1 = entry1[0];
                final String time2 = entry2[0];
                return time1.compareTo(time2);
            }
        });

今、私は物事に問題を抱えています。ここでコードをステップスルーします。問題が見つかった場合は教えてください。

最初に私は配列を持っています:

String[][] fps = new String[2][15];
Arrays.fill(fps[0], "empty");
Arrays.fill(fps[1], "0");

次に、プログラムの他の部分から得られるものを配列に入力します。この例では、ガベージ値を使用しません。

fps[0][0] = "Java";
fps[1][0] = "1";

fps[0][1] = "C++";
fps[1][1] = "14";

fps[0][2] = "C#";
fps[1][2] = "21";

fps[0][3] = "Python";
fps[1][3] = "9001";

ここで、上記の並べ替えコマンドを呼び出します(これらの値は配列を完全に満たすわけではなく、新しいデータがないビンがいくつかあることに注意してください)。

Arrays.sort(fps, new Comparator<String[]>() {
            @Override
            public int compare(final String[] entry1, final String[] entry2) {
                final String time1 = entry1[0];
                final String time2 = entry2[0];
                return time1.compareTo(time2);
            }
        });

これで配列が並べ替えられ、2D配列で値を検索したいので、Arrays.searchを使用して、クエリがどのビンにあるかを見つけます。

int searchIndex = Arrays.binarySearch(fps[0], "Java");
System.out.println(searchIndex);

これがコードであり、ソート部分が正しく機能していないという問題を切り分けたと思います。他にご不明な点がございましたら、コメント欄に投稿してください。同様に、この不可解な問題に対する可能な解決策があれば、私はそれを聞いてみたいです!


PS:明確にするために、これは機能していましたが、ラップトップをシャットダウンし、次に起動したとき(そしてそれ以降)は機能しませんでした。

PPS:要求に応じて出力:

現在の出力:

-16
FPS:
    0 ---- No FPS For you!
    1 ---- Only one FPS
    2 ---- Only two FPS
    3 ---- Only three FPS
    4 ---- Only four FPS
    5 ---- Only five FPS
    6 ---- Only six FPS
    7 ---- Only seven FPS
    8 ---- Only eight FPS
    9 ---- Only nine FPS
    1 ---- Blah!

期待される/期待される出力:

-16
FPS:
    1 ---- Blah!
    0 ---- No FPS For you!
    8 ---- Only eight FPS
    5 ---- Only five FPS
    4 ---- Only four FPS
    9 ---- Only nine FPS
    1 ---- Only one FPS
    7 ---- Only seven FPS
    6 ---- Only six FPS
    3 ---- Only three FPS
    2 ---- Only two FPS

PPPS:私が現在使用しているコードを見たい場合:

import java.util.*;

public class Test
{
  public static void main (String [] args)
  {

    String[][] fps = new String[2][15];
    Arrays.fill(fps[0], "empty");//Fill up all the spaces so the sort and the search dont crap out
    Arrays.fill(fps[1], "0"); 


    //fps[ROW][COLOUMN] = Value + "";
    //fps[ROW][COLOUMN] = Value Instances + "";

    fps[0][0] = "No FPS For you!";
    fps[1][0] = 0 + "";

    fps[0][1] = "Only one FPS";
    fps[1][1] = 1 + "";

    fps[0][2] = "Only two FPS";
    fps[1][2] = 2 + "";

    fps[0][3] = "Only three FPS";
    fps[1][3] = 3 + "";

    fps[0][4] = "Only four FPS";
    fps[1][4] = 4 + "";

    fps[0][5] = "Only five FPS";
    fps[1][5] = 5 + "";

    fps[0][6] = "Only six FPS";
    fps[1][6] = 6 + "";

    fps[0][7] = "Only seven FPS";
    fps[1][7] = 7 + "";

    fps[0][8] = "Only eight FPS";
    fps[1][8] = 8 + "";

    fps[0][9] = "Only nine FPS";
    fps[1][9] = 9 + "";
    /* FUMBLE WITH ARRAY AFTER THIS LINE ONLY!*/

    //Things to have inputed into the method:
    //currentValue (from the line)
    //currentVariable (so we know what the name of the array we're dealing with is named)

    String currentValue = "Blah!"; //This is the value that will be searched for in the array, if found its child int is incremented by one, if not found it is added to the array.


    //Do a binary sort then search in the fps[0] side of things, makesure that the [1] are carried with the [0] changes.

    Arrays.sort(fps, new Comparator<String[]>() {
            @Override
            public int compare(final String[] entry1, final String[] entry2) {
                final String time1 = entry1[0];
                final String time2 = entry2[0];
                return time1.compareTo(time2);
            }
        });

    int searchIndex = Arrays.binarySearch(fps[0], currentValue); //Get the index of the current search value
    System.out.println(searchIndex); //  <-- Returns a neg number each time which shows that the sorting is not working correctly, and therefore the search is being thrown off... need to somehow fix.

    if(searchIndex >= 0)// If the value is found
    {
      fps[0][searchIndex] = (Integer.parseInt(fps[0][searchIndex]) + 1) + "";  //Add one instance to the value

    } //end if
    else //Otherwise find the next open value spot and change it to the current search query (and assign its instances to 1
    {

      for(int i = 0; i < fps[1].length ; i++)
      {
        if(fps[1][i].equals("empty"))
        {
          fps[1][i] = currentValue;
          fps[0][i] = 1 + "";
          i = fps[1].length; //force the for loop to exit

          Arrays.sort(fps, new Comparator<String[]>() {
            @Override
            public int compare(final String[] entry1, final String[] entry2) {
                final String time1 = entry1[0];
                final String time2 = entry2[0];
                return time1.compareTo(time2);
            }
        }); //end Arrays.sort
        }//end if
      }//end for
    }//end else


    //... Print array in rectangular form
    System.out.println("FPS:");

    for (int i =0; (!(fps[1][i].equals("empty")) ) ; i++)
    {
      System.out.println("\t" + fps[0][i] + " ---- " + fps[1][i] );


    }//end for
  }//end main
}//end class
4

3 に答える 3

1

インデックスが逆になっていると思います。並べ替えてfpsいます。 fpsソートされている要素は2つだけです。15個の要素を並べ替えようとしていると思います。インデックスを逆にすると、希望の並べ替えができると思います。

String[][] fps = new String[15][2];

この場合、2D配列ではなく、オブジェクトの配列を検討することもできます。それはより論理的な構造のようであり、この種の混乱を避けるでしょう。

于 2013-03-08T21:37:09.803 に答える
0

この Answerで指摘されている問題に加えて、次の問題があります。

int searchIndex = Arrays.binarySearch(fps[0], "Java");

カスタム コンパレータを使用して並べ替えを行ったので、同じカスタム コンパレータを使用してバイナリ検索を実行する必要があります。を使用しbinarySearch(T[] a, T key, Comparator<? super T> c)ます。(引数が 2 つのバージョンを使用すると、 がString[]実装されていないため、例外が発生するはずですComparable。)

于 2013-03-09T02:47:26.573 に答える
0

オブジェクトに関するリソースはありますか (これと同様のインスタンスで使用される場合)

カスタム オブジェクトを使用する場合の例については、Comparator を使用した並べ替え - 降順 (ユーザー定義クラス)を参照してください。

次元の 1 つは文字列を持ち、もう 1 つは int を持ちます (便宜上、文字列として格納されます)

数値の文字列表現のソートは数値のソートとは異なるため、便利ではありません。カスタムオブジェクトを使用すると、データを適切に保存できるため、適切に並べ替えることができます。

于 2013-03-09T02:33:07.740 に答える