質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1127閲覧

テキストファイルからint型配列に格納する方法について

azurl

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/13 07:20

1
30
51
16
2

のように書かれているテキストファイルからint型の配列にこれを格納もしくはString型の配列からint型に変換して、二分探索を行いたいです。下記のようにコードを書いてみたのですが、うまくいきませんでした。
こちら初心者なので間違い等多々あると思いますがご教授いただけると幸いです。

package practice;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Test{

public static void main(String[] args) { BufferedReader br = null; //配列の要素を宣言します。 String str[] = new String[10000]; Scanner sc=new Scanner(System.in); int x = sc.nextInt(); int pos = -1; int lower = 0; // 下限 int upper = str.length - 1; // 上限 int n=0; int[] num = new int[ str.length ]; // String型の値をint型の値に変換 for ( int i = 0; i < strTable.length; i++ ) { try { int value = Integer.valueOf( str[ i ] ); num[ i ] = value; } catch( NumberFormatException ne ) { return ; } } try { br = new BufferedReader(new FileReader("G:\download\test.txt")); int i = 0; //ファイルの件数分ループして配列に格納 while (br.ready()) { String line = br.readLine(); str[i] = line; i++; } double startTime=System.currentTimeMillis(); while (lower <= upper) { n++; int mid = (lower + upper) / 2; if (num[mid] == x) { pos = mid; break; } else if (num[mid] < x) { lower = mid + 1; } else { upper = mid - 1; } } double endTime=System.currentTimeMillis(); System.out.println("探索時間="+(endTime - startTime)+"[ms]"); if (pos < 0) { System.out.println("見つかりません"); } else { System.out.println(x + "は" + pos + "番目です"); System.out.println("探索回数は"+n+"回"); } }catch (FileNotFoundException e){ System.out.println("ファイルが見つかりません。"); e.printStackTrace(); }catch (IOException e){ System.out.println("入出力エラーです。"); e.printStackTrace(); }finally{ if(br != null){ try{ br.close(); }catch(IOException e) { System.out.println("入出力エラーです。"); e.printStackTrace(); } } } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2021/11/13 07:38

コードは"<code>"または"<コード>"のボタンを押して出てくるやつの中に書きましょう。 今のままでは読みづらいので編集しましょう。 質問は編集できるので編集しましょう。
dodox86

2021/11/13 08:19

こちらでの指摘、確認事項が放置されているようです。 [javaでテキストファイルから線形探索、二分探索を行うコードについて] https://teratail.com/questions/369038 2分探索の前にまずテキストファイルから整数の配列を正しく生成できるようになるのが先決ではないでしょうか。 「コード書いて"みた"→何かうまく動かない→初心者なので教えてほしい」とはいきません。
guest

回答1

0

ベストアンサー

例えばこんな感じの作りになると思いますよ。

Java

1 2package practice; 3 4import java.io.BufferedReader; 5import java.io.FileReader; 6import java.io.IOException; 7import java.util.Scanner; 8 9 10public class Test { 11 12 private static final String FILE_NAME = "G:\download\test.txt"; 13 private static final int LIMIT = 10000; 14 15 /** 読込み先 */ 16 private static int[] numbers; 17 /** 読込み件数 */ 18 private static int length; 19 20 public static void main(String[] args) throws IOException { 21 22 load(); 23 24 int x = enterValue(); 25 26 int[] copy = new int[length]; 27 28 System.arraycopy(numbers, 0, copy, 0, copy.length); 29 linearSearch(copy, x); 30 31 System.arraycopy(numbers, 0, copy, 0, copy.length); 32 binarySearch(copy, x); 33 } 34 35 /** 36 * ファイル読込み 37 */ 38 private static void load() throws IOException { 39 40 System.out.println("読込み中: " + FILE_NAME); 41 42 numbers = new int[LIMIT]; 43 length = 0; 44 45 FileReader reader = new FileReader(FILE_NAME); 46 47 try { 48 49 BufferedReader r = new BufferedReader(reader); 50 51 for (int i = 0; i < numbers.length; i ++) { 52 53 String line = r.readLine(); 54 if (line == null) { 55 break; 56 } 57 58 numbers[i] = Integer.parseInt(line); 59 length ++; 60 } 61 62 } finally { 63 64 reader.close(); 65 } 66 67 System.out.printf("%d 行%n%n", length); 68 } 69 70 /** 71 * 値入力 72 */ 73 private static int enterValue() { 74 75 System.out.print("値を入力: "); 76 77 Scanner sc = new Scanner(System.in); 78 int x = sc.nextInt(); 79 80 System.out.println(); 81 return x; 82 } 83 84 /** 85 * 線形探索 86 */ 87 private static void linearSearch(int[] data, int x) { 88 89 int n = 0; 90 91 long start = System.currentTimeMillis(); 92 93 /* さすがに自分で実装する */ 94 95 long time = System.currentTimeMillis() - start; 96 97 System.out.printf("線形探索結果%n"); 98 System.out.printf("比較回数: %d 回%n", n); 99 System.out.printf("所要時間: %d ms%n%n", time); 100 } 101 102 103 /** 104 * 二分探索 105 */ 106 private static void binarySearch(int[] data, int x) { 107 108 int lower = 0; 109 int upper = data.length - 1; 110 111 int n = 0; 112 113 long start = System.currentTimeMillis(); 114 115 /* もちろん自分で実装する */ 116 117 long time = System.currentTimeMillis() - start; 118 119 System.out.printf("二分探索結果%n"); 120 System.out.printf("比較回数: %d 回%n", n); 121 System.out.printf("所要時間: %d ms%n%n", time); 122 } 123}

投稿2021/11/17 15:11

momodx

総合スコア185

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問