2016-09-08 1 views
0

私は別のクラスから別のクラスのJSONObjectを受け取るメソッドを持っています。このJSONObjectは、パラメータを抽出するたびに保持され、add(new Entry ...)に再送されます。プロセスを開始し、更新されたデータで新しいJSONObjectを受け取ってから再び抽出します。Androidクラス内のJSONの重複したパラメータ

このJSONObjectを毎回受信すると、パラメータを抽出できますが、「温度と日付」をinmediatlyに追加する必要はありません。 (新しいエントリー..) "を追加するには、私はこのパラメタが"リスト "または" MAP "に保存されている必要があります。なぜ?

たびに、受信したJSONOBJECTS

# first time 
{"Id_temp":"1","temperatura":"20","Insertado_temp":"2016-08-16 12:30:29"} 

# second time 
{"Id_temp":"1","temperatura":"20","Insertado_temp":"2016-08-16 12:30:29"} 

# third time 
{"Id_temp":"2","temperatura":"25","Insertado_temp":"2016-08-16 15:48:53"} 

# Fourth time 
{"Id_temp":"4","temperatura":"50","Insertado_temp":"2016-08-16 18:17:33"} 

# Fith time 
{"Id_temp":"1","temperatura":"20","Insertado_temp":"2016-08-16 12:30:29"} 

# An so on ... 

ここに示すように、私はJSONの中にいくつかの重複したデータを受け取ります。すべてのヘルプは大歓迎だろう

public class GraficaBarometro extends AppCompatActivity implements OnLoopjCompletedBarometro { 

private DrawerLayout drawerLayout; 

private OnLoopjCompletedBarometro loopjListener; 

// Progress Dialog Object 
ProgressDialog prgDialog; 
// Error Msg TextView Object 
TextView errorMsg; 
// Email Edit View Object 

private String temeperatura; 

private Timestamp timestamp; 


List<Entry> presiones = new ArrayList<>(); 
List<Entry> temperaturas = new ArrayList<>(); 
List<String> dates = new ArrayList<>(); 



LineChart mChart; 

LoopjTasksBarometro loopjTasks; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.actividad_grafica_barometro); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    String idObjeto = (String) getIntent().getExtras().getSerializable("IdentidadEnviada"); 

    loopjTasks = new LoopjTasksBarometro(this, this); 
    loopjTasks.CaptarParametros(idObjeto); 


    mChart = (LineChart) findViewById(R.id.chartbarometro); 

    int currentTime = (int) System.currentTimeMillis(); 
    timestamp = new Timestamp(currentTime); 

    // no description text 
    mChart.setDescription(""); 
    mChart.setNoDataTextDescription("You need to provide data for the chart."); 

    // enable touch gestures 
    mChart.setTouchEnabled(true); 

    mChart.setDragDecelerationFrictionCoef(0.9f); 

    // enable scaling and dragging 
    mChart.setDragEnabled(true); 
    mChart.setScaleEnabled(true); 
    mChart.setDrawGridBackground(true); 
    mChart.setHighlightPerDragEnabled(true); 

    // limit the number of visible entries 
    mChart.setVisibleXRangeMaximum(5); 

    // if disabled, scaling can be done on x- and y-axis separately 
    mChart.setPinchZoom(true); 

    // set an alternative background color 
    mChart.setBackgroundColor(Color.LTGRAY); 


    mChart.animateX(2500); 

// to draw X-axis for our graph; 

    XAxis xAxis = mChart.getXAxis(); 
    xAxis.setTextSize(11f); 
    xAxis.setEnabled(true); 
    xAxis.setPosition(com.github.mikephil.charting.components.XAxis.XAxisPosition.BOTTOM); 
    //xAxis.setAxisMaxValue(125f); 
    xAxis.setAxisMinValue(0f); 
    xAxis.setTextColor(Color.DKGRAY); 
    xAxis.setDrawGridLines(false); 
    xAxis.setDrawAxisLine(true); 

    // to draw axis line 

    //modify leftYaxis range similarly others 
    YAxis leftAxis = mChart.getAxisLeft(); 
    leftAxis.setTextColor(ColorTemplate.getHoloBlue()); 
    leftAxis.setAxisMaxValue(50f); 
    leftAxis.setAxisMinValue(10f); 
    leftAxis.setDrawGridLines(false); 
    leftAxis.setGranularityEnabled(true); 


    YAxis rightAxis = mChart.getAxisRight(); 
    rightAxis.setTextColor(Color.RED); 
    rightAxis.setAxisMaxValue(50f); 
    rightAxis.setAxisMinValue(10f); 
    rightAxis.setDrawGridLines(false); 
    rightAxis.setDrawZeroLine(false); 
    rightAxis.setGranularityEnabled(false); 


} 


private void agregarToolbar() { 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    final ActionBar ab = getSupportActionBar(); 
    if (ab != null) { 
     // Poner ícono del drawer toggle 
     ab.setHomeAsUpIndicator(R.drawable.drawer_toggle); 
     ab.setDisplayHomeAsUpEnabled(true); 
    } 

} 

private void prepararDrawer(NavigationView navigationView) { 
    navigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        menuItem.setChecked(true); 
        seleccionarItem(menuItem); 
        drawerLayout.closeDrawers(); 
        return true; 
       } 
      }); 

} 


private void seleccionarItem(MenuItem itemDrawer) { 
    Fragment fragmentoGenerico = null; 

    FragmentManager fragmentManager = getSupportFragmentManager(); 


    switch (itemDrawer.getItemId()) { 



     case R.id.item_web: 

      startActivity(new Intent(this, WebOficial.class)); 
      break; 

     //fragmentoGenerico = new BlankFragment(); 


     case R.id.item_categorias: 
      startActivity(new Intent(this, ActividadListaObjeto.class)); 
      break; 

     case R.id.item_acceso: 
      startActivity(new Intent(this, MainActivity.class)); 
      break; 
    } 
    if (fragmentoGenerico != null) { 
     fragmentManager 
       .beginTransaction() 
       .replace(R.id.contenido_principal, fragmentoGenerico) 
       .commit(); 

     /* 
     if(fragmentTransaction) { 
      getSupportFragmentManager().beginTransaction() 
        .replace(R.id.content_frame, fragment) 
        .commit(); 
      */ 

    } 

    // Setear titulo actual 
    setTitle(itemDrawer.getTitle()); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_actividad_principal, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      drawerLayout.openDrawer(GravityCompat.START); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 


private void setData() { 

    LineDataSet set1, set2; 

    // create a dataset and give it a type 
    //modifications with colour and stuf 
    set1 = new LineDataSet(temperaturas, "temperatura"); 

    set1.setAxisDependency(YAxis.AxisDependency.LEFT); 
    set1.setColor(ColorTemplate.getHoloBlue()); 
    set1.setCircleColor(Color.WHITE); 
    set1.setLineWidth(2f); 
    set1.setCircleRadius(2f); 
    set1.setFillAlpha(65); 
    set1.setFillColor(ColorTemplate.getHoloBlue()); 
    set1.setHighLightColor(Color.rgb(244, 117, 117)); 
    set1.setDrawCircleHole(false); 


    //set1.setFillFormatter(new MyFillFormatter(0f)); 
    //set1.setDrawHorizontalHighlightIndicator(false); 
    //set1.setVisible(false); 
    //set1.setCircleHoleColor(Color.WHITE); 

    // create a dataset and give it a type 
    // similar above 
    set2 = new LineDataSet(presiones, "presion"); 
    set2.setAxisDependency(YAxis.AxisDependency.RIGHT); 
    set2.setColor(Color.RED); 
    set2.setCircleColor(Color.WHITE); 
    set2.setLineWidth(2f); 
    set2.setCircleRadius(2f); 
    set2.setFillAlpha(65); 
    set2.setFillColor(Color.RED); 
    set2.setDrawCircleHole(false); 
    set2.setHighLightColor(Color.rgb(244, 117, 117)); 
    //set2.setFillFormatter(new MyFillFormatter(900f)); 


    mChart.getXAxis().setValueFormatter(new AxisValueFormatter() { 
     @Override 
     public String getFormattedValue(float value, AxisBase axis) { 
      return dates.get((int) value); 
     } 

     @Override 
     public int getDecimalDigits() { 
      return 0; 
     } 
    }); 

    ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>(); 
    dataSets.add(set1); // add the datasets 
    dataSets.add(set2); 


    // create a data object with the datasets 
    LineData data = new LineData(dataSets); 
    data.setValueTextColor(Color.BLACK); 
    data.setValueTextSize(9f); 

    // set data 
    Log.i("Lists Sizedata", temperaturas.size() + " and " + presiones.size()); 
    mChart.setData(data); 
    // move to the latest entry 
    mChart.moveViewToX(data.getEntryCount()); 


} 

@Override 
public void onLoopjTaskCompletedBarometro(JSONObject parametrosdht11, int i) { 
    String temperatura = null; 
    String presion = null; 
    String fecha = null; 
    String Id = null; 



    try { 


     temperatura = parametrosdht11.getString("temperatura"); 
     presion = parametrosdht11.getString("presion"); 
     fecha = parametrosdht11.getString("Insertado_temp"); 
     Id = parametrosdht11.getString("Id_temp"); 




    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 


    temperaturas.add(new Entry(Float.valueOf(i), Float.valueOf(temperatura))); 
    presiones.add(new Entry(Float.valueOf(i), Float.valueOf(presion))); 
    dates.add(fecha); // reduce the string to just 12:13 etc 





    //rrefresh we don't need to refresh since we are setting data after completing task 
    mChart.notifyDataSetChanged(); 
    // mChart.setVisibleXRangeMaximum(12); 

    //Log.i(UtilitiesGlobal.TAG, "onSuccess: loopj " + usuarioiJSONbject); 
    Log.i(UtilitiesGlobal.TAG, "onSuccess: loopj " + "temperatura: " + temperatura + " presion: " 
      + presion + " Fecha Inserción: " + fecha); 

} 



@Override 
public void onLoopCompleteBarometro() { 
    setData(); 
    // it takes time to recieve time. so we set the map after loop is complete okay? 
    //mChart.setVisibleXRangeMaximum(5); 
} 
} 

が、これはコード(更新)です。

+1

(temperaturas.contains ...) - >この項目を追加できる場合、温度を追加する前にすでに処理値が含まれているかどうかを確認してください – lubilis

+0

"temperaturas"は、メソッドの外で宣言されています。初期値はありません。 "リスト temperaturas =新しいArrayList <>();"だから私は処理の価値がないと思う。 –

+0

あなたはループしていないし、temperaturas.size()は最大== 1になるでしょう、重複はどこですか?それらはtemperatura変数にありますか? (jsonの1つの行から単一の属性値を取得しているので奇妙に思えます) – lubilis

答えて

0

ここは私のために最終的に働く解決策です。

最初の問題は、サーバーで3つのテーブルをジョインしたために発生しました。これにより、APPに送信される重複したデータが作成されました。

私はMPAndroidChartを使用しているので、 "setValueFormatter"メソッドを使用して特別なフォーマットが必要な場合は、X軸の場合はList<String>、データセットを作成する場合は "Y"軸ごとにList<Entry>が必要です。これらはMPAndroidChatの特別な問題です。

ここからは重複をなくす必要があります。そこで、私はonCreateでHashSetを宣言します:

"mediciones = new HashSet <>();"

別のクラス上に作成されます。これは、等号を使用してデータをフィルタリングするために使用されます

とhashCode「Medicion」

public class Medicion { 
private static final String TAG = "Medicion"; 

private String temperatura, presion, fecha, id; 

public Medicion(String temperatura, String presion, String fecha, String id) { 
    this.temperatura = temperatura; 
    this.presion = presion; 
    this.fecha = fecha; 
    this.id = id; 
} 

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    Medicion medicion = (Medicion) o; 

    return id.equals(medicion.id); 
} 

@Override 
public int hashCode() { 
    int result = id.hashCode(); 

    return result; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public String getFecha() { 
    return fecha; 
} 

public void setFecha(String fecha) { 
    this.fecha = fecha; 
} 

public String getPresion() { 
    return presion; 
} 

public void setPresion(String presion) { 
    this.presion = presion; 
} 

public String getTemperatura() { 
    return temperatura; 
} 

public void setTemperatura(String temperatura) { 
    this.temperatura = temperatura; 
} 

}

我々はそれを持っていたら、我々は戻ってメインの活動に行くと、私たちは、「Medicion」のHashSetのオブジェクトを作成し、我々は

@Override 
public void onLoopjTaskCompletedBarometro(ArrayList<JSONObject> arrayJSONObjects) { 

    String temperatura = null; 
    String presion = null; 
    String fecha = null; 
    String Id = null; 
    String altitud = null; 
    JSONObject date = null; 

    int index = 0; 

    for (JSONObject jsonObject : arrayJSONObjects) { 

     try { 
      Id = jsonObject.getString("Id_temp"); 
      temperatura = jsonObject.getString("temperatura"); 
      fecha = jsonObject.getString("Insertado_temp"); 
      presion = jsonObject.getString("presion"); 
      altitud = jsonObject.getString("altitud"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     Medicion medicion = new Medicion(temperatura, presion, fecha, Id); 

     if (!mediciones.contains(medicion)) { 
      mediciones.add(medicion); 


     temperaturas.add(new Entry(Float.valueOf(index), Float.valueOf(medicion.getTemperatura()))); 
     presiones.add(new Entry(Float.valueOf(index), Float.valueOf(medicion.getPresion()))); 
     dates.add(fecha); // reduce the string to just 12:13 etc 
     index++; 
    } 
    } 

    for (Medicion temporaryMed : mediciones) { 
     Log.i(UtilitiesGlobal.TAG, "onLoopjTaskCompletedBarometro: listado sin dobles " 
       + temporaryMed.getId()); 
     Log.i(UtilitiesGlobal.TAG, "onSuccess: loopj " 
       + "temperatura: " + temporaryMed.getTemperatura() 
       + " presion: " + temporaryMed.getPresion() 
       + " Fecha Inserción: " + temporaryMed.getFecha()); 
    } 

だから最終的に我々はY軸上の非重複データとチャートを持つListにfileteredデータを渡しますenter image description here

0

リストの重複したエントリを削除するには、リストまたはリストにないデータをSETに追加する必要があります。 Setは重複したエントリを追加することができませんでした。そして、これもあなたの仕事を簡単にします。また、このリンクをチェックしてSetについてのより良いアイデアを得る。 What is the difference between Set and List?

希望、そうかもしれません!今、あなただけのこれらのオブジェクト内のデータを追加し、これらが重複する値を追加することはできません

Set<Entry> presiones = new LinkedHashSet<>(); 
    Set<Entry> temperaturas = new LinkedHashSet<>(); 
    Set<String> dates = new LinkedHashSet<>(); 

:私はあなたは自分のコード内で次の変更を行うと思うの重複値を排除するために

+0

複製は許可されません。しかし、私はトウの質問を持っています: –

+0

設定されている場合は、重複を受信し、戻ってエラーを送信するか、上書きするか?この場合、HashSetまたはLinkedHashSetを使用する方が良いでしょうか? –

+0

設定では、オブジェクトを上書きしません。同じオブジェクトが既に追加されているため、オブジェクトが再び来るとオブジェクトを拒否します。 2番目の質問:順序付きリストの場合、LinkedHashSetを使用するべきです。 –

0

+0

このソリューションに関する問題は、import com.github.mikephil.charting.data.Entryがjava.util.listで動作するチャートに必要ですが、LinkedHashSetにはjava.lang.Objectが必要です。あなたが書いたとおりに、それは直接的な方法であり、実装することはできません。 –