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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

3回答

3800閲覧

JAVA 指定した配列のキーを削除することはできるのか? phpで言うところのunset()

earnest_gay

総合スコア615

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/12/29 14:22

編集2017/08/28 08:56
<?php /*削除ボタンを押すたびにサブ画像だけを削除したい。 流れとして、例えばユーザーが持つ画像をDBから4つ取得してそれは配列に詰めている。 ImageViewも配列に詰めている。 その配列にあるImageViewに、DBから取得した画像をセットしている。 */ class test { public $arr = array( "メイン画像", "サブ画像1", "サブ画像2", "サブ画像3" ); //下記は削除ボタンを押すたびに走るメソッドだと思ってください。 public function targetrecordSubImageDelete() { //降順ソート krsort($this->arr); foreach ($this->arr as $key => $value) { echo "削除対象キー =>".$key."<br>"; echo $value."を削除します。<br>"; //メイン画像は残したい if($key == 0) { echo __FUNCTION__."メソッドではメイン画像は削除できません。"; continue; } else if($key == 1 or $key == 2 or $key == 3) { /* 実際はDBから削除する処理があるが中略。 */ //削除したら、次回削除ボタンを押した時の為に、今回削除したサブ画像だけを配列から削除。 unset($this->arr[$key]); //表示エリアに表示させる画像が逆になるのでソートを戻す。 ksort($this->arr); //ImageViewにセットするメソッドをここあたりで呼び出して再帰的にセットさせる、、、 break; } } } } $test = new test(); echo "削除前の配列<br>"; echo "<pre>"; var_dump($test->arr); echo "</pre>"; echo "*****************************************<br>"; //削除ボタンを1回押しました。 $test->targetrecordSubImageDelete(); echo "<br>削除ボタンを1回押した後の配列の中身。<br>"; echo "<pre>"; var_dump($test->arr); echo "</pre>"; echo "*****************************************<br>"; //削除ボタンを2回押しました。 $test->targetrecordSubImageDelete(); echo "<br>削除ボタンを2回押した後の配列の中身。<br>"; echo "<pre>"; var_dump($test->arr); echo "</pre>"; echo "*****************************************<br>"; //削除ボタンを3回押しました。 $test->targetrecordSubImageDelete(); echo "<br>削除ボタンを3回押した後の配列の中身。<br>"; echo "<pre>"; var_dump($test->arr); echo "</pre>"; echo "*****************************************<br>"; //削除ボタンを4回押しました。 $test->targetrecordSubImageDelete(); echo "<br>削除ボタンを4回押した後の配列の中身。<br>"; echo "<pre>"; var_dump($test->arr); echo "</pre>"; ?>

イメージ説明

これと同じことをJAVAでやりたいんですが、配列を削除するメソッドみたいなものをJAVAにはあるのでしょうか?
画像に対応するボタンがそれぞれあれば楽なのですが、
サブ画像削除1
サブ画像削除2
サブ画像削除3
みたいな、、、

そうじゃなくてボタンは1つにしてほしいとのことなので、上記のようなソースで対応するしかないのでちょっと困ってますが何か良いアイディアがありましたら教えていただけると助かります。

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

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

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

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

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

swordone

2016/12/29 15:05

要するに、サブ画像(数字)の数字の大きいものから順に削除するということでいいですか?
earnest_gay

2016/12/29 15:07

そうです。但し、配列にはサブ画像1と2しかない時もありますし、サブ画像1しかない時もありますし。また、このメソッドではメイン画像は削除できません。
guest

回答3

0

Javaの「配列」はそういった機能は持ちませんが、様々なList系クラスで実装できます。
どのListも持っているremoveがわかりやすいでしょう。持ってる要素数はsizeで取得できるので、

java

1list.remove(list.size() - 1);

のようにできます。メイン画像を削除したくないというなら、事前にサイズチェックして、1の時(つまり内容がメイン画像だけのとき)は削除しなければいいですし。

投稿2016/12/29 15:16

swordone

総合スコア20651

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

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

0

ベストアンサー

JAVA 指定した配列のキーを削除することはできるのか? phpで言うところのunset()
(中略)
これと同じことをJAVAでやりたいんですが、配列を削除するメソッドみたいなものをJAVAにはあるのでしょうか?

Javaにおいて配列に対しPHPなどでいうところのunset()操作は実装されていません。
ですが、自前で実装することも十分可能です。

ざっくり処理を並べると、
0. 対象の配列よりサイズが1少ない新しい配列を用意
0. 対象配列を削除するインデックスの要素を除いて新しい配列にコピー
0. 新しい配列をreturn

もちろんListを使ったほうがもっと単純化できると思うのですが、ArrayList#toArray()は使い勝手が悪い(Objectで返ってきたりなど)のと、総称型を使ってunset()を定義でき汎用性が高いので私はこちらを使っています。

以下、実装例です

T[] list : 対象のリスト
int index : 削除するインデックス
Class<?> arrayClass : 戻り値の配列型(listの型と一致させてください)

Java

1@SuppressWarnings("unchecked") 2public <T> T[] unset(T[] list, int index, Class<?> arrayClass) { 3 if(index < 0 || index >= list.length) return list; 4 5 T[] new_list = (T[]) Array.newInstance(arrayClass, list.length - 1); 6 7 int count = 0; 8 9 for(int i = 0; i < list.length; i++) { 10 if(i != index) { 11 new_list[count] = list[i]; 12 count++; 13 } 14 } 15 16 return new_list; 17}

総称型では配列をnewすることができないので、Array#newInstance()をつかっています。

↓以下、String[]型の配列で2番目の要素を削除する例です

Java

1String[] test = { 2 "メイン画像", 3 "サブ画像1", 4 "サブ画像2", 5 "サブ画像3" 6}; 7 8test = unset(test, 2, String.class);

以上です。ご不明な点がございましたらお知らせください。

投稿2016/12/31 09:18

編集2016/12/31 10:07
Zooey

総合スコア55

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

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

0

削除できる配列としてListインターフェースが有名で、そのインターフェースを実装したArrayListクラスがよく使われます。
簡単な使い方として

java

1// listの宣言 2ArrayList<ImageView> imageList = new ArrayList<ImageView>();

イメージの追加

java

1// イメージの宣言と設定 2imageList.add(new ImageView(this)); 3imageList.get(0).setImage???(???); 4// レイアウトの宣言とイメージ追加 5LinearLayout imageListLayout = new LinearLayout(this); 6imageListLayout.addView(imageList.get(0));

イメージの削除

java

1// 最後のimageViewを一つ消すメソッド 2// 戻り値は消えたかどうか 3boolean remImage(){ 4 int lastIndex = imageList.size() - 1; 5 if(lastIndex <= 0){ 6 return false; 7 } 8 imageListLayout.removeView(imageList.get(lastIndex));// 親要素から対象の要素を削除する 9 // imageList.get(lastIndex).setVisibility(View.GONE);// 非表示にして詰める 上かどちらか 10 imageList.remove(lastIndex);// 配列から要素の削除 11 return true; 12}

こんな感じになるかと。
動作確認していないのでミスがあったらすみません

投稿2016/12/29 22:15

intelf___

総合スコア868

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問